1、题目描述
https://leetcode-cn.com/problems/balanced-binary-tree/
给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
2、代码详解
最优解:从底至顶(提前阻断)
思路是对二叉树做后序遍历,从底至顶返回子树最大高度,若判定某子树不是平衡树则 “剪枝” ,直接向上返回。
递归推导
- 递归到最深处返回0,因为叶子节点的左右节点是空;此时max(left,right)+1=0+1=1 ,+1就是为了计数的,把叶子节点这一层加上
- 想象所有递归到最后第一步返回值都是1,然后往上一层想,叶子节点的父节点也会得到{max(left,right)+1} 的返回值
- 递归的往上统计树的高度
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def isBalanced(self, root):
return self.helper(root) != -1
def helper(self, root):
if not root:
return 0
left = self.helper(root.left)
if left == -1:
return -1
right = self.helper(root.right)
if right == -1:
return -1
if abs(left - right) < 2:
# 返回以节点root为根节点的子树的最大高度
return max(left, right) + 1 # 即节点 root 的左右子树中最大高度加 1
else:
return -1