美文网首页
25将有序数组转换为二叉搜索树

25将有序数组转换为二叉搜索树

作者: Jachin111 | 来源:发表于2020-08-09 19:29 被阅读0次

    将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
    本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

    示例:
    给定有序数组: [-10,-3,0,5,9],
    一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:

          0
          / \
       -3   9
       /     /
    -10    5

    递归
    平衡二叉搜索树需要保证俩点:
    根节点大于左子树任意节点,小于右子树任意节点
    左右子数高度相差不超过 1
    由以上性质,一个可行的递归条件可以得出:每次返回的根节点处于数组中间,以其左右半数组分别递归构造左右子树,那么就意味着左子小于根,右子大于根,且所有节点左右子树节点数相差不超过 1 (由于递归的构树方式相同,所有节点都满足高度平衡)

    class Solution:
        def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
            if nums:
                m = len(nums) // 2
                r = TreeNode(nums[m])
                r.left, r.right = map(self.sortedArrayToBST, [nums[:m], nums[m+1:]])
                return r
    

    二叉搜索树(BST),中序遍历
    实现二叉树的平衡,就每次把一组数最中间的位置,作为树的头拎起来,剩下部分平均分两份就行,要是出多来一个数就分配给左脚or右脚
    具体实现这个平衡条件,我们可以定义一个函数“做一棵树”,而且这个函数只和数组的长度有关,和具体数字等等通通无关:

    class Solution:
        def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
            def make_tree(start_index, end_index): #只和长度有关
                #首先判定我们的区间是否合理,即left_index要<=right_index
                #当相等时,只有root会产生,不会产生左右小树
                if start_index > end_index:
                    return None
                
                #我这里变量名都写得比较长,目的是方便理解
                mid_index = (start_index + end_index)//2
                this_tree_root = TreeNode(nums[mid_index]) #做一个小树的root
    
                this_tree_root.left = make_tree(start_index,mid_index-1)
                this_tree_root.right = make_tree(mid_index+1, end_index)
    
                return this_tree_root #做好的小树
            
            return make_tree(0,len(nums)-1) 
            #可以看到整个题解只和index有关,和数组里的具体数字无关,
            #因为题目给出的“有序数列”帮助我们满足了“二叉搜索树”的条件。
    

    DFS递归, 二分法
    1,平衡二叉搜索树的特点是:每个节点的左右子树都高度差在1以内,每个节点左子树小于右子树。
    2,根据平衡二叉搜索树的特点,可以联想到,每个节点当做根节点的时候,左子树形成的数组一定比它小,右子树形成的数组一定比他大。因此,符合有序数组任意子数组中点的性质。
    3,结合树结构常用的递归思想,可以采用DFS,递归构建这颗树,为了实现每个节点都是平衡二叉搜索树,可以递归二分数组来分配资源,左面的构建左子树,右面的构建右子树,以此递归。

    class Solution:
        def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
            if nums is None:
                return None
            begin = 0
            end = len(nums) - 1
            if begin > end:
                return None
            mid = (begin + end) >> 1
            root = TreeNode(nums[mid])
            root.left = self.sortedArrayToBST(nums[begin:mid])
            root.right = self.sortedArrayToBST(nums[mid+1:end+1])
            return root
    

    来源:力扣(LeetCode)

    相关文章

      网友评论

          本文标题:25将有序数组转换为二叉搜索树

          本文链接:https://www.haomeiwen.com/subject/zfaprktx.html