public class Test23 {
//判断二叉树是否是平衡二叉树
public class Node2{
//树的结构
//这个数要保存的数据类型
private int value;
//这个树的左孩子
private Node2 left;
//这个树的右孩子
private Node2 right;
//构造器(用来初始化这个数)
public Node2(int data){
this.value=data;
}
}
//定义一种数据类型用来保存 递归时要返回的重要信息
public static class ReturnType{
//成员变量
//1.用来保存当前这个数是否平衡
private boolean isBalanced;
//2.用来保存当前这个树的高度
private int height;
//构造器(用来初始化成员变量)
public ReturnType(boolean isBalanced,int height){
this.height=height;
this.isBalanced=isBalanced;
}
}
//递归函数
public static ReturnType process(Node2 root) {
//这是递归的出口 到最末尾了,应该往上返回了
if(root==null){
return new ReturnType(true,0);
}
//去root的左孩子 调用 process方法
ReturnType left=process(root.left);
//去root的右孩子 调用 process 方法
ReturnType right=process(root.right);
//求当前层 树的高度
//策略 左孩子和右孩子中较高的 +1
//int height= left.height> right.height? left.height+1 : right.height+1 ;
//不是有二个数求最值的方法吗
int height=Math.max(left.height, right.height)+1;
//求当前层树是否 是平衡二叉树
//策略 判断左孩子和右孩子 是否 都是平衡 ,如果是 则是平衡二叉树 否则不是
//并且 左孩子 和 右孩子的 高度差 不超过1
boolean isBalance=left.isBalanced&&right.isBalanced&&Math.abs(left.height- right.height)<2;
//小结: 求当前层 树的高度 和 是否是平衡二叉树 就是在收集 信息
//把收集的信息 返回 到上一层
return new ReturnType(isBalance,height);
}
public boolean isBalance(Node2 head){
return process(head).isBalanced;
}