平衡二叉树
对于任意一个节点,左子树和右子树的高度差不超过1.满二叉树一定是平衡二叉树.
解题思路:
在树类问题上,递归函数使用起来很方便.它可以让我们从一个节点上经过三次.利用这个特性可以解决大多数的问题.
我们可以先收集左树信息,再收集右数信息然后返回到当前节点判断该节点是否满足要求.
在本题中,我们需要收集的信息是:左树是否平衡,右树是否平衡以及左树和右树的高度.
1-可能性分析: 判断一棵树是否为平衡树也就是判断任意子树是不是平衡术.
假设我们来到了节点X,判断X是否为平衡树需要如下信息
a-X的左子树是不是平衡树
b-X的右子树是不是平衡树
c-如果都平衡,左子树和右子树的高度是多少
2-设计递归返回结构
递归返回结构应该包含我们需要的 高度和是否平衡.
class Res{
int height;
boolean isB;
Res(int height,boolean isB){
this.height = height;
this.isB = isB;
}
}
3-设计递归过程
public static Res process(Node head){
//1-基本的边界值判断
if(head == null){
return (0,true);
}
//3-左节点返回的值
Res leftRes = process(head.left);
//4-根据左节点的返回值做出判断
if(!leftRes.isB){
return new Res(0,false);
}
//5-右节点的返回值
Res rightRes = process(head.right)
//6-同样做出判断
if(!rightRes.isB){
return new Res(0,false);
}
if(Math.abs(leftRes.height - rightRes.height) > 1){
return new Res(0,false);
}
//2-当前节点符合条件,应该返回什么
return new Res(Math.max(leftRes.height,rightRes.height) + 1, true);
}