该题解的主要思路分为两个步骤:
1. 利用中序遍历将二叉搜索树转换成一个有序数组。中序遍历的顺序保证了数组的有序性,因为对于任何二叉搜索树,其中序遍历结果都是按照键值升序排列的。
2. 使用递归方法根据有序数组构建一棵平衡二叉搜索树(BST)。选取数组的中间元素作为树的根节点,然后递归地对中间元素的左半部分和右半部分执行同样的操作,分别生成左子树和右子树。这种方法可以确保新树的平衡性,因为每次都是从中间划分数组。
时间复杂度: O(n)
空间复杂度: O(n)
# 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 root is None:
return
vals = []
stack = []
while root is not None or len(stack) > 0:
if root is not None:
stack.append(root)
root = root.left
else:
root = stack.pop()
vals.append(root.val)
root = root.right
# 通过有序数组构建平衡BST
return self.buildBST(vals, 0, len(vals)-1)
def buildBST(self, vals, i, j):
# 递归终止条件
if i > j:
return
# 选择中间元素作为根节点
mid = (i + j) // 2
root = TreeNode(vals[mid])
# 递归构建左右子树
root.left = self.buildBST(vals, i, mid-1)
root.right = self.buildBST(vals, mid+1, j)
return root