1. 题目描述
给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。
如果一棵二叉搜索树中,每个节点的两棵子树高度差不超过 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 之间。
2. 第一种方法
因为要变平衡,所以又要找中点。
- 常规思路就是先搞个中序遍历,获得一个升序序列;
- 然后搞个重建二叉树,获得序列的中点,将其转换为根节点,再依次递归重建左子树和右子树;
- 最后回到主函数依次调用上面两个辅助函数即可。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def balanceBST(self, root: TreeNode) -> TreeNode:
self.result = []
self.inorder(root)
return self.rebuildTree(0, len(self.result) - 1)
def inorder(self, root):
if not root:
return None
self.inorder(root.left)
self.result.append(root.val)
self.inorder(root.right)
def rebuildTree(self, left, right):
if left > right:
return None
mid = (left + right) // 2
root = TreeNode(self.result[mid])
root.left = self.rebuildTree(left, mid - 1)
root.right = self.rebuildTree(mid + 1, right)
return root
3. 第二种方法
大体看上去跟第一种没多大区别,但是不知为何就是比第一种要快一些,贴出来对比一下
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def balanceBST(self, root: TreeNode) -> TreeNode:
if root == None:
return None
res = []
self.mid_sort(root, res)
return self.createBST(res, 0, len(res)-1)
# 中序遍历
def mid_sort(self, root, res):
if root:
if root.left:
self.mid_sort(root.left, res)
res.append(root)
if root.right:
self.mid_sort(root.right, res)
# 创建BST
def createBST(self, res, l_idx, r_idx):
mid = (l_idx + r_idx) // 2
mid_point = res[mid]
mid_point.left = None
mid_point.right = None
if l_idx < mid:
mid_point.left = self.createBST(res, l_idx, mid-1)
if r_idx > mid:
mid_point.right = self.createBST(res, mid+1, r_idx)
return mid_point