leetcode_1382 将二叉搜索树变平衡

73 阅读1分钟

要求

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

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

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

示例:

image.png

输入: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 之间。

核心代码

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def balanceBST(self, root: TreeNode) -> TreeNode:
        if not root:
            return
        return self.build(self.dfs(root))
    
    def dfs(self,root):
        if not root:
            return []
        return self.dfs(root.left) + [root.val] + self.dfs(root.right)
    
    def build(self,nums):
        if not nums:
            return None
        mid = len(nums) // 2
        node = TreeNode(nums[mid])
        left = nums[:mid]
        right = nums[mid + 1:]
        node.left = self.build(left)
        node.right = self.build(right)
        return node

image.png

解题思路:我们首先先使用中序遍历将二叉搜索树变成一个有序的列表,然后我们使用二分法构建平衡二叉树,这个部分值得借鉴,整体比较简单。