LeetCode-Python-1382. 将二叉搜索树变平衡(树)

给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。

如果一棵二叉搜索树中,每个节点的两棵子树高度差不超过 1 ,我们就称这棵二叉搜索树是 平衡的 。

如果有多种构造方法,请你返回任意一种。

示例:

输入:root = [1,null,2,null,3,null,4,null,null]
输出:[2,1,3,null,null,null,4]
解释:这不是唯一的正确答案,[3,1,4,null,2,null,null] 也是一个可行的构造方案。

提示:

  • 树节点的数目在 1 到 10^4 之间。
  • 树节点的值互不相同,且在 1 到 10^5 之间。

思路:

可以写AVL树的左旋右旋,但是我比较懒,选择直接从0开始建树,

先得到先序遍历数组,然后递归建树即可。

每次把数组最中间的元素作为根节点,左一半数组用于建左树,右一半数组用于建右树,这样可以保证建出来的树平衡。

时间复杂度:O(N)

空间复杂度:O(N)

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

class Solution(object):
    def balanceBST(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        def inorder(node):
            if not node:
                return []
            return inorder(node.left) + [node.val] + inorder(node.right)
        
        l = inorder(root)
        
        def generator(l):
            if not l:
                return None
            idx = len(l) // 2
            root = TreeNode(l[idx])
            root.left = generator(l[:idx])
            root.right = generator(l[idx + 1:])
            return root
            
        return generator(l)
发布了722 篇原创文章 · 获赞 105 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/qq_32424059/article/details/104981555