题目
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
分析
思路一:
平衡二叉树:所有节点的左右子树深度相差不超过1
直接利用一个寻找二叉树深度的函数,分别判断左右子树的深度之差不超过1,如果每个节点都符合这样的规律,那么它就是一个平衡二叉树。
时间复杂度:o(N)
空间复杂度:o(N)
代码:
public class Solution {
public boolean IsBalanced_Solution(TreeNode root) {
if(root==null) return true;
int left = TreeDepth(root.left);
int right = TreeDepth(root.right);
if((left-right)>1||(left-right)<-1) return false;
return IsBalanced_Solution(root.left)&&IsBalanced_Solution(root.right);
}
private int TreeDepth(TreeNode root){
if(root==null) return 0;
int nLeft = TreeDepth(root.left);
int nRight = TreeDepth(root.right);
return nLeft>nRight?(nLeft+1):(nRight+1);
}
}
思路二:
第一种方法可以看到首先我们判断根节点(1)是否平衡,此时会遍历4、5、7,然后当判断左子树根节点(2)时,又会遍历4、5、7,这种重复遍历显然我们是不想遇到的。所以我们改变思路,从下向上遍历,如果子树不是平衡二叉树,直接返回-1表示非二叉树,如果子树是则返回高度继续遍历。这样我们就只遍历一次节点。
时间复杂度:o(N)
空间复杂度:o(N)
代码:
public class Solution {
public boolean IsBalanced_Solution(TreeNode root) {
return getDepth(root) != -1;
}
private 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);
}
}