问题描述
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过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 。
限制:
0 <= 树的结点个数 <= 10000
解题思路:后序遍历 + 剪枝 (从底至顶)
思路是对二叉树做后序遍历,从底至顶返回子树深度,若判定某子树不是平衡树则 “剪枝” ,直接向上返回。
算法流程:
recur(TreeNode p)函数
返回值:
当节点root 左 / 右子树的深度差绝对值≤1 :则返回当前子树的深度,即节点 root 的左 / 右子树的深度最大值 +1 ( max(left, right) + 1 );
当节点root 左 / 右子树的深度差的绝对值>=2 :则返回−1 ,代表 此子树不是平衡树 。
终止条件:
当 root 为空:说明越过叶节点,因此返回高度 0 ;
当左(右)子树深度为−1 :代表此树的 左(右)子树 不是平衡树,因此剪枝,直接返回 −1 ;
class Solution {
public boolean isBalanced(TreeNode root) {
//返回-1表示不是平衡二叉树
if(recur(root)==-1){
return false;
}else{
return true;
}
}
public int recur(TreeNode p){
//如果该子树为空,直接返回0
if(p==null){
return 0;
}
int leftheight=recur(p.left); //计算左子树的深度
int rightheight=recur(p.right); //计算右子树的深度
//如果左右子树有一个为-1(代表不平衡)或者左右子树的高度差的绝对值大于1,返回-1
if(leftheight==-1 || rightheight==-1 || Math.abs(rightheight-leftheight)>1){
return -1;
}else{
//否则,返回左右子树的最大值+1
return Math.max(leftheight,rightheight)+1;
}
}
}