急急~判断一棵二叉树是满二叉树的算法!
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了急急~判断一棵二叉树是满二叉树的算法!相关的知识,希望对你有一定的参考价值。
参考技术A 我的思路是利用满二叉树的性质来判断。满二叉树一定符合节点数
=
2的n次方
-1
(n为深度)
所以可以先遍历二叉树,并记录深度和节点数,最后做出判断
#include<stdio.h>
void
inorder(bintree
*t,int
currentDeep)
if(*t!=NULL)
if(currentDeep>deep)
deep=currentDeep;
/*
如果当前深度大于记录的深度,则更新深度
*/
countNodes++;
/*
节点数加一
*/
inorder(t->lchild,currentDeep+1);
/*
访问当前节点的左孩子,并把当前节点的深度+1传给调用函数
*/
inorder(t->rchild,currentDeep+1);
/*
访问当前节点的右孩子,并把当前节点的深度+1传给调用函数
*/
main()
/*
p
为二叉树的根节点,其定义略
*/
int
currentDeep=1;
/*
currentDeep用于记录当前深度
static
int
deep=0;
/*
静态变量deep用于记录已检索的最大深度
*/
static
int
countNodes=0;
/*
静态变量countNodes用于记录已检索的节点数目
*/
inorder(p,currentDeep);
/*
中序遍历二叉树从而得到二叉树的深度以及节点数目
*/
if(countNodes<(pow(2,deep)-1))
printf("这不是一棵满二叉树。");
else
printf("这是一棵满二叉树。");
/*
利用满二叉树的节点数一定等于2的深度次方减1做出判断
*/
/*
pow函数的作用是求2的deep次方
*/
camb_yang
同学满二叉树为什么就不用判断呢?
java数据结构与算法之判断是否是满二叉树
1、满二叉树的定义
除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。
国内教程定义:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。
参考:百度百科.满二叉树的定义
2、根据满二叉树的定义,求解方法如下:
其实明白了满二叉树的定义后,这个题就很好解了,无非就是求得整棵树的高度和节点个数,看看高度和节点个数是否满足
N = 2^L - 1
公式即可。
- 求出节点个数 N 和树的最大深度 L
- 通过公式:N = 2^L - 1 计算即可,如果等式成立,则说明是一棵满二叉树,否则就不是满二叉树。
- 可以使用二叉树题目的套路来求解该题目(即递归向左右孩子要信息)!!!
代码如下:
public static class ReturnData {
// 节点的个数
public int count;
// 树的高度
public int heigh;
public ReturnData(final int count, final int heigh) {
this.count = count;
this.heigh = heigh;
}
}
public static ReturnData isFullTreeProcess(final TreeNode head) {
// base case
if (head == null) {
// 当节点为空的时候,递归向上返回,此时该节点代表的子树的节点个数为0,树高位0
return new ReturnData(0, 0);
}
// 1、向左孩子要数据
final ReturnData leftResult = isFullTreeProcess(head.left);
// 2、向右孩子要数据
final ReturnData rightResult = isFullTreeProcess(head.right);
// 3、组装当前节点的数据,最后返回给递归调用的上层
// 由当前节点组成的子树的节点个数 = 左孩子的节点个数 + 有孩子的节点个数 + 1
final int currentCount = (leftResult.count + rightResult.count) + 1;
// 由当前节点组成的子树的高度 = 左右孩子中树高最高的那个 + 1
final int currentHeigh = leftResult.heigh > rightResult.heigh ? leftResult.heigh + 1 : rightResult.heigh + 1;
return new ReturnData(currentCount, currentHeigh);
}
以上是关于急急~判断一棵二叉树是满二叉树的算法!的主要内容,如果未能解决你的问题,请参考以下文章