LeetCode 108. 将有序数组转换为二叉搜索树

  • 题意:
    给定一个有序数组,要求转化为二叉搜索平衡树。
  • 思路:
    我们知道,二叉搜索树的中序遍历是有序的,所以题目相当于给定中序遍历,创建一个二叉平衡树。
    如果是一个无序数组,我们创建二叉搜索树时,每插入一个节点都要进行二分查找寻找合适的位置,但因为已经有序,所以每次选择一个根节点,左边的数就是左子树,右边的是右子树。
    因为需要一个平衡树,所以选根节点的时候选中间的节点即可。如果是奇数就选中间的数,偶数就选左边的。选中间的节点,可以保证左右子树的节点数相差不超过1,那么为什么可以保证平衡呢?因为树的定义都是递归的,二叉平衡树是:对于每个子树,其根节点的左右子树的高度差 <= 1。我并没有证明(当然也不会),而是直观感受,对于最小的子树,因为其节点最多为3,最少为2,选中间的节点,这样使得此子树为平衡;而递归定义,可以使得每个子树都是平衡树。
  • 代码:
    C++
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* solve(vector<int>& nums, int l, int r){
        if(l > r){
            return NULL;
        }
        int mid = (l + r)/2;
        TreeNode* root = new TreeNode(nums[mid]);
        // cout<val<
        root->left = solve(nums, l, mid-1);
        root->right = solve(nums, mid+1, r);
        return root;
    }
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        return solve(nums, 0, nums.size()-1);
    }
};

Python:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
        def solve(l, r):
            if l > r:
                return None
            mid = (l + r) // 2
            root = TreeNode(nums[mid])
            root.left = solve(l, mid-1)
            root.right = solve(mid+1, r)
            return root
        return solve(0, len(nums)-1)

总而言之,树这一概念需要注意的是,其定义是递归的。二叉搜索平衡树,其一,数组有序,所以只要选定一个节点,左边左子树,右边右子树,就满足搜索树的条件;其二,每次选择中间的节点,就可以满足平衡的条件。
当然,定义有兴趣的可以去官方解答看,我选择是记住这个方法。

  • 收获:
    1、Python 函数内部可以再定义函数。每次调用大函数时,内部函数也会被调用。但不能在函数外部,直接调用内函数。
    2、Python 中 空对象是 None。
    3、Python取整:
    (a + b) /2 。这样无论a和b是什么类型,最后返回都是float。
    (a + b) // 2。这样是先计算,再向下取整。若都是int,则返回int;有一个float,则返回float。
    math.floor(x) 。 是取不大于x的最近整数,例如math.floor(-1.6) = -2。

你可能感兴趣的:(LeetCode,数据结构)