急急~判断一棵二叉树是满二叉树的算法!

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);
    }

以上是关于急急~判断一棵二叉树是满二叉树的算法!的主要内容,如果未能解决你的问题,请参考以下文章

完全二叉树与满二叉树的区别是啥?

判断二叉树是不是为满二叉树 (C++描述)

java数据结构与算法之判断是否是满二叉树

二叉树的概念和基本术语

完全二叉树的性质

DataWhale--二叉树