一般思路:采用递归,从根节点出发,判断左边平衡、右边平衡;获得左侧树高、右侧树高;判断当前是否平衡。
剑指offer的优化思路:由于上述自顶向下需要重复遍历结点效率降低,因此采用自底向上,每一层返回是否平衡以及当前树高,供给上一层使用,提高效率。
算法的点:每一层使用Answer数组返回平衡与否的信息以及当前树高,只要发现不平衡,可以提前终止。
import java.lang.Math;
public class Solution {
public int[] IsBalanced(TreeNode root){
int[] Answer=new int[2];
Answer[0]=0;
Answer[1]=0;
if(root==null){//树为空,提前结束
Answer[0]=1;
Answer[1]=0;
return Answer;
}
//左边子树判断与计算高度
int[] leftAnswer=IsBalanced(root.left);
if(leftAnswer[0]==0){//左子树不平衡,提前结束
return Answer;
}
//右边子树判断与计算高度
int[] rightAnswer=IsBalanced(root.right);
if(rightAnswer[0]==0){//右子树不平衡,提前结束
return Answer;
}
//左右平衡,判断当前
if(Math.abs(leftAnswer[1]-rightAnswer[1])>1){
return Answer;
}
Answer[0]=1;
Answer[1]=Math.max(leftAnswer[1],rightAnswer[1])+1;
return Answer;
}
public boolean IsBalanced_Solution(TreeNode root) {
int[] Answer=IsBalanced(root);
if(Answer[0]==1) return true;
return false;
}
}