判断二叉树是否为完全二叉树算法(二叉树是否一种完全树)

:暂无数据 2026-07-15 20:20:01 :1

判断二叉树是否为完全二叉树算法(二叉树是否一种完全树)

各位老铁们好,相信很多人对判断二叉树是否为完全二叉树算法都不是特别的了解,因此呢,今天就来为大家分享下关于判断二叉树是否为完全二叉树算法以及二叉树是否一种完全树的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

本文目录

二叉树是否一种完全树

1、含义不同:

完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。

2、表示不同:

对于满二叉树,除最后一层无任何子节点外,每一层上的所有结点都有两个子结点二叉树。而完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。

对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。

判断一棵树是否是完全二叉树的思路

1》如果树为空,则直接返回错

2》如果树不为空:层序遍历二叉树

2.1》如果一个结点左右孩子都不为空,则pop该节点,将其左右孩子入队列;

2.1》如果遇到一个结点,左孩子为空,右孩子不为空,则该树一定不是完全二叉树;

2.2》如果遇到一个结点,左孩子不为空,右孩子为空;或者左右孩子都为空,且则该节点之后的队列中的结点都为叶子节点,该树才是完全二叉树,否则就不是完全二叉树;

以上内容参考:百度百科-完全二叉树

怎么判断是否是完全二叉树 用C++或C语言

你可以上网先找一个用队列实现二叉树的广度优先搜索的代码,然后在代码中增加一个标志变量tag,初始化为0。然后找到代码中访问结点的那句代码,在那句代码处增加
if(tag==0)
判断该结点是否有两个孩子,如果没有两个孩子,则将tag=1
else
判断该结点是否为叶结点,如果不是叶结点,则不是完全二叉树。

判断完全二叉树用C语言编写

用一个线性表和一个队列,表存放的是边集,队列用于按层次遍历。程序流程如下

1 初始化空表、空队;

2 输入结点数、指定根结点,输入边到表中;

3 根结点进队;

4 将队首出队到p;

5 若表为空,返回1(真)。不空则在表中查找第一项等于p的边i。若找到,将边i的第二项进队,从表中删除边i。若没有找到,则返回0(假)。

6 若表为空,返回1(真)。不空则在表中查找第二项等于p的边i。若找到,将边i的第一项进队,从表中删除边i。若没有找到,则返回0(假)。

7 跳到4。

补充提供一个相应的程序代码如下,你可以试试

#include 《stdio.h》
#define N 1024

void main( )
{
    short list, listLength = 0, front = 0, rear = 0, r, n, i, p;/*1  初始化空表,空队*/
    char flag;   /*flag是判断结果标识*/
    scanf("%d%d", &n, &r);    /*2  输入结点数、指定根结点,输入边到表中*/
    for(i = 0; i 《 n - 1; i++)
        scanf("%d%d", &list);
    listLength = n - 1;
    queue = r;    /*3  根结点进队*/
    while(1) {
        p = queue;   /*4  将队首出队到p*/
        if(listLength == 0) {    /*5  如果表为空,则返回1(真)*/
            flag = 1;  
            break;
        }
        for(i = 0; i 《 listLength && list != p; i++);  /*寻找第一项等于p的边i*/
        if(i == listLength) {    /*如果没有找到,返回0(假)*/
            flag = 0;
            break;
        }
        queue;   /*将边i的第二项进队*/
        for(; i 《 listLength - 1; i++)        /*删除边i*/
            list;
        listLength--;

        if(listLength == 0) {   /*6  若表为空,返回1(真)*/
            flag = 1;
            break;
        }
        for(i = 0; i 《 listLength && list != p; i++);   /*在表中查找第二项等于p的边i*/
        if(i == listLength) {    /*如果没有找到,返回0(假)*/
            flag = 0;
            break;
        }
        queue;   /*将边i的第一项进队*/
        for(; i 《 listLength - 1; i++)           /*删除边i*/
            list;
        listLength--;
    }    /*7  跳到4*/
    if(flag)
        printf("yes\n");
    else
        printf("no\n");
}

运行结果

完全二叉树的算法

如果一棵具有n个结点的深度为k的二叉树,它的每一个结点都与深度为k的满二叉树中编号为1~n的结点一一对应,这棵二叉树称为完全二叉树。
可以根据公式进行推导,假设n0是度为0的结点总数(即叶子结点数),n1是度为1的结点总数,n2是度为2的结点总数,由二叉树的性质可知:n0=n2+1,则n= n0+n1+n2(其中n为完全二叉树的结点总数),由上述公式把n2消去得:n= 2n0+n1-1,由于完全二叉树中度为1的结点数只有两种可能0或1,由此得到n0=(n+1)/2或n0=n/2。
总结起来,就是 n0=表示上取整。可根据完全二叉树的结点总数计算出叶子结点数。

将一棵有100个结点的完全二叉树从根这一层开始,每一层上从左到右依次对结点进行编号,根结点的编号为1

编号为49的结点的左孩子编号为98,公式是2i,不是2i+1。

举个简单的例子就可以看出来的,比如7个节点时(也就是三层时),编号为1的左子树编号是2,编号2的左子树是4,编号3的左子树编号为6,以此就可以看出来。

一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同。

算法思路

判断一棵树是否是完全二叉树的思路

如果树为空,则直接返回错

如果树不为空:层序遍历二叉树

如果一个结点左右孩子都不为空,则pop该节点,将其左右孩子入队列;

如果遇到一个结点,左孩子为空,右孩子不为空,则该树一定不是完全二叉树;

以上内容参考:百度百科-完全二叉树

如何判断二叉树是否是完全二叉树 递归

bool isComplete(TreeNode * root, bool &isFull, int &deep)
{
isFull = true;
if (root == NULL) //空树为完全(且满)二叉树
return true;
isFull = false;
if (root-》left == NULL && root-》right != NULL)//右子树存在,左子树不存在则不是完全二叉树
return false;
deep = deep + 1;
//左子树的高度,左子树是满二叉树,左子树是完全二叉树吗?
int leftDeep = deep;
bool leftFull = false;
bool leftComplete = isComplete(root-》left, isFull, leftDeep);
//右子树的高度,右子树是满二叉树,右子树是完全二叉树吗?
int rightDeep = deep;
bool rightFull = false;
bool rightComplete = isComplete(root-》right, isFull, rightDeep);
deep = leftDeep;
//左右子树有一个不是完全二叉树,则树不是完全二叉树
if (!leftComplete || !rightComplete)
return false;
//左右子树为满二叉树,且左右子树深度一致,则此树为完全(且满)二叉树
if (leftFull && rightFull && leftDeep == rightDeep)
{
isFull = true;
return true;
}
//左右子树为满二叉树,且右子树近比左子树矮1,则此树为完全二叉树
if (leftFull && rightFull && leftDeep == (rightDeep + 1))
return true;
//左子树为非满二叉树,右子树为满二叉树,且右子树近比左子树矮1,则此树为完全二叉树
if (!leftFull && rightFull && leftDeep == (rightDeep + 1))
return true;
//否则为非完全二叉树
return false;
}

编写函数判断一棵给定二叉树是否为完全二叉树

#include《
iostream
》
#include《deque》
using
namespace
std;
struct
SHAGUO
{
char
data;
struct
SHAGUO
*lchild,*rchild;
};
typedef
SHAGUO*
bitree;
void
createtree(
bitree
&shaguo)
{
char
c;
cin》》c;
if(c==’#’)
shaguo
=
NULL;
else
{
shaguo
=
new
SHAGUO;
shaguo-》data
=
c;
createtree(shaguo-》lchild);
createtree(shaguo-》rchild);
}
}
int
isfulltree(SHAGUO
*t)//判断是否完全二叉树
{
deque《SHAGUO
*》shaguo;
SHAGUO
*p
=
NULL
;
shaguo.push_front(t);
while(!shaguo.empty())
{
p
=
shaguo.front();
shaguo.pop_front();
if(p)//不为空左右孩子入队
{
shaguo.push_back(p-》lchild);
shaguo.push_back(p-》rchild);
}
else
while(!shaguo.empty())//找到空节点
{
p
=
shaguo.front();
shaguo.pop_front();
if(p)//空节点后还有节点
非
{
cout《《"非完全二叉树"《《endl;
return
0;
}
}
}
return
1;
}
void
main()
{
SHAGUO
*
shaguo;
cout《《"先序输入二叉树节点
#代表空节点"《《endl;
createtree(shaguo);
if(isfulltree(shaguo))
cout《《"是完全二叉树"《《endl;
}
或者参考一下下面的帖子

编写算法,判断一个二叉树链存储的二叉树是否为完全二叉树

#include 《stdio.h》
#include 《stdlib.h》
#define Max 100
typedef struct Node
{
char data;
struct Node * LChild,*RChild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree * bt)
{
char ch;
ch=getchar();
if(ch==10)ch=getchar();//如果为 回车换行 读取下一个字符
if(ch==’.’) *bt=NULL; //如果为 . 代表此节点为空
else
{
* bt=(BiTree)malloc(sizeof(BiTNode));
(* bt)-》data=ch; //赋值
CreateBiTree(&((* bt)-》LChild));
CreateBiTree(&((* bt)-》RChild));
}
}
bool fullBiTree(BiTree b)
{
if(b-》LChild==NULL && b-》RChild==NULL)return true;// 如果左右子树为空,返回真
if(b-》LChild==NULL || b-》RChild==NULL)return false;// 如果左右子树只有一个为空,返回假
return fullBiTree(b-》LChild) && fullBiTree(b-》RChild);// 通过递归,返回
}
void main()
{
printf("请依次输入字符\n");
BiTree b;
CreateBiTree(&b); //创建二叉树
bool cm=fullBiTree(b);
if(cm)printf("´此二叉树为完全二叉树\n");
else printf("´此二叉树不是完全二叉树\n");
}

关于判断二叉树是否为完全二叉树算法,二叉树是否一种完全树的介绍到此结束,希望对大家有所帮助。

判断二叉树是否为完全二叉树算法(二叉树是否一种完全树)

本文编辑:admin

更多文章:


withdrawal(withdrawal是什么意思)

withdrawal(withdrawal是什么意思)

今天给各位分享withdrawal是什么意思的知识,其中也会对withdrawal是什么意思进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年10月11日 07:00

根据流程图怎么编写程序(用c语言根据流程图写程序)

根据流程图怎么编写程序(用c语言根据流程图写程序)

大家好,今天小编来为大家解答以下的问题,关于根据流程图怎么编写程序,用c语言根据流程图写程序这个很多人还不知道,现在让我们一起来看看吧!

2026年10月11日 06:00

在from子句中可以出现(如何在from 子句中嵌套查询下面的语句在access中出错!)

在from子句中可以出现(如何在from 子句中嵌套查询下面的语句在access中出错!)

大家好,关于在from子句中可以出现很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于如何在from 子句中嵌套查询下面的语句在access中出错!的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望

2026年10月11日 05:20

countif函数统计个数怎么用(countif函数怎么用 详解Excel中countif函数的使用方法)

countif函数统计个数怎么用(countif函数怎么用 详解Excel中countif函数的使用方法)

其实countif函数统计个数怎么用的问题并不复杂,但是又很多的朋友都不太了解countif函数怎么用 详解Excel中countif函数的使用方法,因此呢,今天小编就来为大家分享countif函数统计个数怎么用的一些知识,希望可以帮助到大

2026年10月11日 03:30

正则匹配数字之前的字符(正则表达式如何匹配前面是数字、中间是“/”、后面也是数字,就像2/3专业的模式)

正则匹配数字之前的字符(正则表达式如何匹配前面是数字、中间是“/”、后面也是数字,就像2/3专业的模式)

本篇文章给大家谈谈正则匹配数字之前的字符,以及正则表达式如何匹配前面是数字、中间是“/”、后面也是数字,就像2/3专业的模式对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问

2026年10月11日 03:00

register语言学(register语言学)

register语言学(register语言学)

“register语言学”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看register语言学(register语言学)!

2026年10月11日 01:40

系统架构设计师可以直接考吗(学生可以报名系统架构设计师吗)

系统架构设计师可以直接考吗(学生可以报名系统架构设计师吗)

“系统架构设计师可以直接考吗”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看系统架构设计师可以直接考吗(学生可以报名系统架构设计师吗)!

2026年10月11日 01:00

orlnsertbootmediinselected(我电脑开机显示这个是什么意思or insert boot media in select)

orlnsertbootmediinselected(我电脑开机显示这个是什么意思or insert boot media in select)

大家好,如果您还对orlnsertbootmediinselected不太了解,没有关系,今天就由本站为大家分享orlnsertbootmediinselected的知识,包括我电脑开机显示这个是什么意思or insert boot med

2026年10月10日 23:00

display的用法(display是什么意思 详解display的含义和用法)

display的用法(display是什么意思 详解display的含义和用法)

大家好,如果您还对display的用法不太了解,没有关系,今天就由本站为大家分享display的用法的知识,包括display是什么意思 详解display的含义和用法的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年10月10日 22:00

html全部居中代码(怎么让网页居中显示,html如何让网页居中)

html全部居中代码(怎么让网页居中显示,html如何让网页居中)

大家好,今天小编来为大家解答以下的问题,关于html全部居中代码,怎么让网页居中显示,html如何让网页居中这个很多人还不知道,现在让我们一起来看看吧!

2026年10月10日 21:10

最近更新

withdrawal(withdrawal是什么意思)
2026-10-11 07:00:01 浏览:0
热门文章

标签列表