需要重复遍历结点的算法
private static boolean isBalanced(Tree root) {
if (root == null) {
return false;
}
int left = getDepth(root.left);
int right = getDepth(root.right);
int diff = Math.abs(left - right);
if (diff > 1) {
return false;
}
return isBalanced(root.left) && isBalanced(root.right);
}
private static int getDepth(Tree root) {
if (root == null) {
return 0;
}
int left = getDepth(root.left);
int right = getDepth(root.right);
int max = Math.max(left, right);
return 1 + max;
}
每个结点只遍历一次的解法
private static boolean isBalanced2(Tree root) {
int[] depth = { 0 };
return isBalanced(root, depth);
}
/**
* 使用后根遍历算法,记录每个结点的深度
* @param root 结点指针
* @param depth 当前结点的深度,由于java是传值的,无法在函数中修改传入的int,所以传int[]
* @return 当前结点是否是平衡结点
*/
private static boolean isBalanced(Tree root, int[] depth) {
if (root == null) {
depth[0] = 0;
return true;
}
int[] left = { 0 }, right = { 0 };
if (isBalanced(root.left, left) && isBalanced(root.right, right)) {
int diff = Math.abs(left[0] - right[0]);
if (diff <= 1) {
depth[0] = 1 + Math.max(left[0], right[0]);
return true;
}
}
return false;
}