题目
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
解题思路
递归判断非叶节点左右子树的高度之差,若相差不超过1,那么它就是一棵平衡二叉树;否则不是
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isBalanced(TreeNode root) {
if(root==null){
return true;
}
int l=depth(root.left);
int r=depth(root.right);
int c=l-r;
if(c>=-1&&c<=1){
return isBalanced(root.left)&&isBalanced(root.right);
}else{
return false;
}
}
int depth(TreeNode root){
if(root==null){
return 0;
}
int l=depth(root.left);
int r=depth(root.right);
return (l>r?l:r)+1;
}
}
优化:
因为上面的题解中在计算深度和判断平衡的时候重复计算了树的高度;
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isBalanced(TreeNode root) {
if(root==null){
return true;
}
if(depth(root)==-1){
return false;
}else{
return true;
}
}
int depth(TreeNode root){
if(root==null){
return 0;
}
int l=depth(root.left);
//返回-1不符合条件,已经不是平衡二叉树了
if(l==-1)return -1;
int r=depth(root.right);
//返回-1不符合条件,已经不是平衡二叉树了
if(r==-1)return -1;
//返回-1不符合条件,已经不是平衡二叉树了
if(Math.abs(l-r)>1)return -1;
return (l>r?l:r)+1;
}
}