题目
分析:
根据定义,一棵二叉树 T存在节点p∈T,满足时,它是不平衡的。下图中每个节点的高度都被标记出来,高亮区域是一棵不平衡子树。
![img](https://pic.leetcode-cn.com/Figures/110/110-unbalanced-wheight-highlighted.png)
平衡子树暗示了一个事实,每棵子树也是一个子问题。
现在的问题是:按照什么顺序处理这些子问题?
方法一:从底至顶(提前阻断)
此方法为本题的最优解法,但“从底至顶”的思路不易第一时间想到。
思路是对二叉树做先序遍历,从底至顶返回子树最大高度,若判定某子树不是平衡树则 “剪枝” ,直接向上返回。
算法流程:
recur(root):
- 递归返回值:
- 当节点
root
左 / 右子树的高度差 < 2 :则返回以节点root
为根节点的子树的最大高度,即节点root
的左右子树中最大高度(代表此节点root的高度)加 1。(max(left, right) + 1
) - 当节点
root
左 / 右子树的高度差 ≥2 :则返回 -1 ,代表 此子树不是平衡树 。
- 当节点
- 递归终止条件:
- 当越过叶子节点时,返回高度 0;
- 当左(右)子树高度
left== -1
时,代表此子树的 左(右)子树 不是平衡树,因此直接返回 -1 ;
isBalanced(root)
:
- 返回值: 若
recur(root) != 1
,则说明此树平衡,返回 true; 否则返回 false 。
代码:
class Solution {
public