大家好,都吃晚饭了吗?我是Kaiqisan,是一个已经走出社恐的一般生徒,今天还是二叉树的内容!
首先明确一个概念----何为平衡二叉树
答:左子树和右子树高度差小于等于1
所以判断一个数是否为平衡二叉树的时候需要遍历所有的子树
因为概念的限制,即使一颗树在最高的根节点处看起来是平衡的,但如果某个子树不平衡的话,那这棵树还是不平衡的!
举个例子
1
/ \
2 3
/ / \
4 6 7
/
5
这棵树虽然在根节点处是平衡的(左边4右边3)
但是
在2这个子树这里却是不平衡的(左边2右边0)
所以这棵树并不是平衡二叉树
思路
每次递归遍历子树,如果遇到不平衡的二叉树直接返回,如果是平衡的,就返回当前层数+1,如果左右子树层数不同的,取最大。
以下提供两种方法
static int process2(Tree head) {
// 到达最下面的节点,无法往下走了,层数的统计也从这里开始
if (head == null) {
return 0;
}
int left = process2(head.left);
// 如果遇到-1就不干了直接返回,直到根节点,下面也是一样的
if (left == -1) {
return -1;
}
int right = process2(head.right);
if (right == -1) {
return -1;
}
// 遇到不平衡子树返回-1
if (Math.abs(left - right) > 1) {
return -1;
}
// 如果能达到这一次,那么当前的树是平衡的,返回左右子树的最大深度+1
return Math.max(left, right) + 1;
}
static ReturnData process(Tree head) {
if (head == null) {
return new ReturnData(true, 0);
}
ReturnData left = process(head.left);
if (!left.isBalance) {
return new ReturnData(false, 0);
}
ReturnData right = process(head.right);
if (!right.isBalance) {
return new ReturnData(false, 0);
}
if (Math.abs(left.h - right.h) > 1) {
return new ReturnData(false, 0);
}
return new ReturnData(true, Math.max(left.h, right.h) + 1);
}
.../* 上面的类整合所有的反馈信息,表达更加清晰 */
class ReturnData {
public boolean isBalance;
public int h;
public ReturnData(boolean isBalance, int h) {
this.isBalance = isBalance;
this.h = h;
}
}
总结
没有总结,记住统计树的层数的方法!