题目描述
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
法一
思路大概是求二叉树的深度那道题来的,但有个问题,就是节点重复遍历。
public class Solution {
public boolean IsBalanced_Solution(TreeNode root) {
if(root == null)
return true;
if(Math.abs(getHeight(root.left)-getHeight(root.right) ) >1)
return false;
return IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right);
//中序:(xx^x^xx) x (x^x x ^)
}
public int getHeight(TreeNode root){
if(root == null)
return 0;
return Math.max(getHeight(root.left), getHeight(root.right) ) + 1;
}
}
法二
运行时间:15ms
占用内存:9308k
public class Solution {
public boolean IsBalanced_Solution(TreeNode root) {
//空树或者左右两个子树高度差不超过1且都是平衡二叉树
if(root == null)
return true;
return getDepth(root) != -1;
}
//因为递归的调用,所以我们实际是从最下层开始向上层计算深度的,
//一旦算出某个子树不为平衡二叉树,则这棵树也不会是平衡的,直接返回-1,不再进行不必要的运算
private int getDepth(TreeNode root){
if(root == null)
return 0;
int left = getDepth(root.left);
if(left == -1) return -1;
int right = getDepth(root.right);
if(right == -1) return -1;
//如果正在计算的深度的子树是平衡二叉树就返回其深度,否则返回-1;
return Math.abs(left - right)>1? -1 : Math.max(left, right)+1 ;
}
}