要求
给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。
如果一棵二叉搜索树中,每个节点的两棵子树高度差不超过 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 之间。
核心代码
# 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
解题思路:我们首先先使用中序遍历将二叉搜索树变成一个有序的列表,然后我们使用二分法构建平衡二叉树,这个部分值得借鉴,整体比较简单。