题目
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
示例 1:
给定二叉树 [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回 true
。
示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]
1
/ \
2 2
/ \
3 3
/ \
4 4
返回 false
。
解答
-
思路:
- 直接递归计算每个节点左右子树的高度;
- 根据AVL树的特性,如果任意一个节点的左右子树的高度差大于一,则该树不是AVL树,标记器高度为-1;
- 如果某个子树的高度计算为-1,则表示该子树不是AVL树,-1会一直传递到顶层。
-
代码:
def isBalanced(self, root): """ :type root: TreeNode :rtype bool (knowledge) 思路: 1. 直接递归计算每个节点左右子树的高度; 2. 根据AVL树的特性,如果任意一个节点的左右子树的高度差大于一,则该树不是AVL树,标记器高度为-1; 3. 如果某个子树的高度计算为-1,则表示该子树不是AVL树,-1会一直传递到顶层。 """ def preOrderTraversal(root): if not root: return 0 leftNum = preOrderTraversal(root.left) rightNum = preOrderTraversal(root.right) if leftNum == -1 or rightNum == -1 or abs(leftNum - rightNum) > 1: return -1 return 1 + max(leftNum, rightNum) return preOrderTraversal(root) != -1
测试验证
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
def __repr__(self):
if self:
return "{}->{}->{}".format(self.val, repr(self.left), repr(self.right))
class Solution:
def isBalanced(self, root):
"""
:type root: TreeNode
:rtype bool
(knowledge)
思路:
1. 直接递归计算每个节点左右子树的高度;
2. 根据AVL树的特性,如果任意一个节点的左右子树的高度差大于一,则该树不是AVL树,标记器高度为-1;
3. 如果某个子树的高度计算为-1,则表示该子树不是AVL树,-1会一直传递到顶层。
"""
def preOrderTraversal(root):
if not root:
return 0
leftNum = preOrderTraversal(root.left)
rightNum = preOrderTraversal(root.right)
if leftNum == -1 or rightNum == -1 or abs(leftNum - rightNum) > 1:
return -1
return 1 + max(leftNum, rightNum)
return preOrderTraversal(root) != -1