题目描述:输入一棵二叉树,判断该二叉树是否是平衡二叉树。
思路:树型dp套路。
1.以某个节点X为头结点的树中,分析答案有哪几种可能性,并且这种分析是以X的左子树,X的右子树和X整棵树的角度来考虑。
可能性1:如果X的左子树不是平衡的,则以X为头结点的树就不是平衡的。
可能性2:如果X的右子树不是平衡的,则以X为头结点的树就不是平衡的。
可能性3:如果X的左子树和右子树的高度差超过1,则以X为头结点的树就不是平衡的。
可能性4:如果该如果以上可能性都没中,则以X为头结点的树是平衡的。
2.根据第一步列出的可能性分析,了除所有需要的信息。左右子树都需要知道各自是否平衡,以及高度这两个信息。
3.根据第二步信息汇总。定义信息如ReturnType类。
4.设计递归函数process。
代码:
public class Solution {
public boolean IsBalanced_Solution(TreeNode root) {
return process(root).isBalanced;
}
public class ReturnType{
public boolean isBalanced;
public int height;
public ReturnType(boolean isBalanced, int height){
this.isBalanced = isBalanced;
this.height = height;
}
}
public ReturnType process(TreeNode head){
if(head == null){
return new ReturnType(true, 0);
}
ReturnType leftData = process(head.left);
ReturnType rightData = process(head.right);
int height = Math.max(leftData.height, rightData.height) + 1;
boolean isBalanced = leftData.isBalanced && rightData.isBalanced && Math.abs(leftData.height - rightData.height) < 2;
return new ReturnType(isBalanced, height);
}
}