题目:输入一棵二叉树,判断该二叉树是否是平衡二叉树。
定义:如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一颗平衡二叉树。
思路一:递归重复遍历左右子树,类似于求二叉树的深度;见《剑指Offer——二叉树的深度》
此思路判断上层节点的时候,会多次重复下层节点,增加了不必要的开销;
思路二:改为从下往上遍历,使用后续遍历左右根,遍历的时候记录左右子树的深度;
如果是平衡二叉树返回子树的高度,如果不是,则停止遍历;
代码:
public static boolean IsBalanced_Solution(TreeNode root) {
return getDepth(root) != -1;
}
private static 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;
//返回平衡二叉树的高度
return Math.abs(left - right) > 1 ? -1 : 1 + Math.max(left, right);
}
参考链接:牛客网-丁满历险记的回答