05 August 2008
二叉树的完全性检验
给定一个二叉树,确定它是否是一个完全二叉树。
完全二叉树的定义如下:
若设二叉树的深度为 h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。(注:第 h 层可能包含 1~ 2h 个节点。)
我们从根节点开始搜索,并将根节点编号值设置为1。
2、然后搜索左子树,并传递其根节点值为2k。搜索右子树,并传递其根节点值为2k+1
3、在递归搜索过程中,记录节点个数n和当前最大节点编号值p。
4、最后判断最大节点值p和节点数n是否相等,相等则该二叉树是完全二叉树,否则不是。
递归边界:
1、题目规定树中最多有100个节点,如果节点编号k > 100,说明该二叉树不合法,返回false。
2、递归到叶子节点,子树递归结束,返回true。
O(n),其中 n是树节点个数 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
int n = 0, p = 0;
public boolean isCompleteTree(TreeNode root) {
if (!dfs(root, 1)) {
return false;
}
return n == p;
}
public boolean dfs(TreeNode root, int k) //k是当前节点编号
{
if (root == null) { //递归到了叶子节点
return true;
}
if (k > 100) {
return false;
}
n++;
p = Math.max(p, k); //记录节点数和最大节点编号值
return dfs(root.left, 2 * k) && dfs(root.right, 2 * k + 1); //递归左右子树
}
}
bfs遍历二叉树的套路,只不过在遍历时要判断一些条件,如果不符合题意就return false,用layerNum记录当前层如果不是最后一层的话应该有的节点数,即2的幂,用recNum记录每一层有的子节点数。用这两个变量来判断是否符合题意。
``java /**
}
*/
class Solution {
public boolean isCompleteTree(TreeNode root) {
Queue
1
2
3
4
}
}
return true; } } ``