题目描述
题目难度:Easy
Given a binary tree, determine if it is height-balanced.
For this problem, a height-balanced binary tree is defined as:
a binary tree in which the depth of the two subtrees of every node never differ by more than 1.
AC代码1
仔细,认真
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
boolean isBalanced = true; //判断每个节点是否平衡
public boolean isBalanced(TreeNode root) {
if(root == null) return isBalanced;
int[] heights = getHeight(root);
// 注意 & 的使用
isBalanced &= Math.abs(heights[0] - heights[1]) <= 1 ? true : false;
return isBalanced;
}
//求每个节点左右子树的高度
private int[] getHeight(TreeNode root){
int[] heights = new int[2];
if(root == null) return heights;
int[] leftHeights = getHeight(root.left);
int[] rightHeights = getHeight(root.right);
int leftMax = Math.max(leftHeights[0], leftHeights[1]);
int rightMax = Math.max(rightHeights[0], rightHeights[1]);
isBalanced &= Math.abs(leftMax - rightMax) <= 1 ? true : false;
heights[0] = leftMax + 1;
heights[1] = rightMax + 1;
return heights;
}
}
AC代码2
这个算法精辟的地方在于 check 函数返回值的含义:
如果当前节点保持平衡,则返回当前节点的高度;
否则返回-1,表示当前节点不是平衡的;
class Solution {
public boolean isBalanced(TreeNode root) {
if(root == null) return true;
if(check(root) == -1) return false;
return true;
}
public int check(TreeNode p){
if(p == null) return 0;
int left = check(p.left);
if(left == -1) return -1;
int right = check(p.right);
if(right == -1) return -1;
if(Math.abs(left - right) > 1) {
return -1;
}
return Math.max(left, right)+1;
}
}