高度平衡的二叉搜索树(平衡二叉树),定义见此Leetbook。简单来说,就是基于相同节点值构建出来的二叉搜索树中高度最小的,即为平衡二叉树(不唯一)。有 N 个节点的平衡二叉搜索树,它的高度是 logN 。并且,每个节点的两个子树的高度不会相差超过 1。
class Solution:
def isBalanced(self, root: TreeNode) -> bool:
def height(node: TreeNode) -> int:
if not node:
return 0
leftHeight = height(node.left)
rightHeight = height(node.right)
if leftHeight == -1 or rightHeight == -1 or abs(leftHeight - rightHeight) > 1:
return -1
else:
return max(leftHeight, rightHeight) + 1
return height(root) >= 0
自底向上的递归,类似于后序遍历,此节点不平衡或者其左子树或右子树不平衡就都返回-1,否则返回树的高度。
108. 将有序数组转换为二叉搜索树(面试题 04.02. 最小高度树)
class Solution:
def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
if not nums:
return None
mid = len(nums) // 2
root = TreeNode(nums[mid])
root.left = self.sortedArrayToBST(nums[:mid])
root.right = self.sortedArrayToBST(nums[mid+1:])
return root
从有序递增数组创建一棵高度平衡的二叉搜索树、或平衡二叉树、或高度最小的二叉搜索树。方法是每次取中位数创建节点,然后左边比它小的是左子树,右边比它大的是右子树,递归。此题思路写法都和从遍历序列构造二叉树很像,可以参考一下。
class Solution:
def balanceBST(self, root: TreeNode) -> TreeNode:
def inorder(node: TreeNode):
if not node:
return None
inorder(node.left)
nums.append(node.val)
inorder(node.right)
nums = []
inorder(root)
def creatBST(numlist) -> TreeNode:
if not numlist:
return None
mid = len(numlist) // 2
node = TreeNode(numlist[mid])
node.left = creatBST(numlist[:mid])
node.right = creatBST(numlist[mid+1:])
return node
return creatBST(nums)
与上一题思路一样,只不过这里需要我们自己对二叉树进行中序遍历得到递增序列,再将数组转换为平衡二叉树。这题的官方题解给出了贪心的证明。