一、题目
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:true
示例 2:
输入:root = [1,2,2,3,3,null,null,4,4]
输出:false
示例 3:
输入:root = []
输出:true
提示:
- 树中的节点数在范围 [0, 5000] 内
- -104 <= Node.val <= 104
二、解决
此树的深度 = Max{左子树深度, 右子树深度} + 1
1、后序遍历+剪枝(从底至顶)
思路:
对二叉树做后序遍历,从底至顶返回子树深度,若判断某子树不是平衡树,则剪枝(不容易第一时间想到),直接向上返回。
算法流程-recur(root)函数:
- 返回值:
- 当节点root 左/右子树的深度差<=1:则返回当前子树的深度,即节点root的左/右子树的深度最大值+1(max(left, right) + 1)
- 当节点root左/右子树的深度差>2:则返回-1,代表了此子树不是平衡树。
- 终止条件:
- 当root为空:说明越过叶节点,因此返回高度0;
- 当左/右子树深度为-1:代表左/右子树不是平衡树,因此剪枝,直接返回-1。
isBalanced(root)函数:
- 返回值:若recur(root) != -1,则说明此树平衡,返回true;否则返回false。
代码:
class Solution {
public boolean isBalanced(TreeNode root) {
return recur(root) != -1;