题目描述
实现一个函数,检查二叉树是否平衡,平衡的定义如下,对于树中的任意一个结点,其两颗子树的高度差不超过1。
给定指向树根结点的指针TreeNode* root,请返回一个bool,代表这棵树是否平衡。
思路一:
用递归来遍历计算每个节点左右子树的高度,最后比较差值。时间复杂度O(N logN)。
public boolean isBalance(TreeNode root) {
if (root == null)
return true;
int heightDiff = getHeight(root.left) - getHeight(root.right);
if (Math.abs(heightDiff) > 1) {
return false;
} else {
return isBalance(root.left) && isBalance(root.right);
}
}
public int getHeight(TreeNode root) {
if (root == null)
return 0;
return Math.max(getHeight(root.left), getHeight(root.right)) + 1;
}
思路二:
减少对getHeight的调用,一次遍历整棵树,在遍历的过程中就判断数是否是平衡的,如果不是返回-1,若是平衡的返回数的高度。时间复杂度O(N),空间复杂度O(H),其中H为树的高度
public boolean isBalance(TreeNode root) {
if (checkHeight(root) == -1) {
return false;
} else {
return true;
}
}
public int checkHeight(TreeNode root) {
if (root == null) {
return 0;
}
int leftHeight = checkHeight(root.left);
if (leftHeight == -1) {
return -1;
}
int rightHeight = checkHeight(root.right);
if (rightHeight == -1) {
return -1;
}
int heigthDiff = leftHeight - rightHeight;
if (Math.abs(heigthDiff) > 1) {
return -1;
} else {
return Math.max(leftHeight, rightHeight) + 1;
}
}