输入一棵二叉树,判断该二叉树是否是平衡二叉树。
在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树。
完全遍历:
public class Solution {
public boolean IsBalanced_Solution(TreeNode root) {
if(root==null)
return true;
if(!(Math.abs(getDepth(root.left,0)-getDepth(root.right,0))<=1)) {
return false;
}
return IsBalanced_Solution(root.left)&&IsBalanced_Solution(root.right);
}
public int getDepth(TreeNode root,int depth) {
if(root!=null) {
depth++;
return Math.max(getDepth(root.left,depth), getDepth(root.right,depth));
}
return depth;
}
}
这种方法是从根节点开始判断左右子树深度,然后再分别进入左子结点、右子结点判断其左右结点深度,一直递归到叶子结点。这样每个节点就遍历了多次。
改为从叶子结点向上遍历时,就只用遍历一次:
public class Solution {
public boolean IsBalanced_Solution(TreeNode root) {
return getDepth(root) != -1;
}
private int getDepth(TreeNode root) {
if (root == null) return 0;//直到叶子结点,从这里返回,由0开始计算高度
int left = getDepth(root.left);
if (left == -1) return -1;
int right = getDepth(root.right);
if (right == -1) return -1;
return Math.abs(left - right) > 1 ? -1 : 1 + Math.max(left, right);
}
}