自顶向下递归
实际就是从根节点的左右节点一层一层检查每一个左右节点的高度差不是小于等于一,check的作用就是检查当前节点的左孩子节点与右孩子节点的高度差是不是小于等于一,check1的作用是检查当前节点的左孩子节点与右孩子节点各自的左右孩子节点高度差是不是小于等于一,如此递归。
class Solution {
public boolean isBalanced(TreeNode root) {
if(root==null){
return true;
}
else{
boolean check=Math.abs(height(root.left)-height(root.right))<=1;
boolean check1=isBalanced(root.right)&&isBalanced(root.left);
return check&&check1;
}
}
public int height(TreeNode root){
if(root==null){
return 0;
}
return Math.max(height(root.left),height(root.right))+1;
}
}
从下到上递归
deep函数返回的类型是int,他要返回的是各个节点的高度。如果存在某个节点的左孩子节点与右孩子节点的高度差大于一就返回-1,代表这棵树不是平衡二叉树。
代码乍一看好像还是从顶递归到底,其实分析一下还是从最底下往上面判断的,因为递归是优先深度的,递归要递归到最底层然后才返回原来的位置继续执行,if语句的三个条件left==-1、right==-1、Math.abs(right-left)>1中,Math.abs(right-left)>1就是用来判断最底层的条件,right=-1,left=-1都是基于存在Math.abs(right-left)>1这个情况上的。
class Solution {
public boolean isBalanced(TreeNode root) {
if(root==null){
return true;
}
return deep(root)!=-1;
}
public int deep(TreeNode root){
if(root==null){
return 0;
}
int left=deep(root.left);
int right=deep(root.right);
if(left==-1||right==-1||Math.abs(right-left)>1){
return -1;
}
return Math.max(left,right)+1;
}
}