❶ c语言 什么叫完全二叉树
在计算机科学中,二叉树是每个结点最多有两个子树的有序树。通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用作二叉查找树和二叉堆。二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2的(i-1)次方个结点;深度为k的二叉树至多有2^(k) -1个结点;对任何一棵二叉树T,如果其终端结点数(即叶子结点数)为n0,度为2的结点数为n2,则n0 = n2 + 1。 树和二叉树的2个主要差别: 1. 树中结点的最大度数没有限制,而二叉树结点的最大度数为2; 2. 树的结点无左、右之分,而二叉树的结点有左、右之分。…… 树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样。树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形象表示。树在计算机领域中也得到广泛应用,如在编译源程序时,可用树表示源程序的语法结构。又如在数据库系统中,树型结构也是信息的重要组织形式之一。一切具有层次关系的问题都可用树来描述。 谢谢采纳
❷ 判断完全二叉树用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[N][2], queue[N], 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[i][0], &list[i][1]);
listLength = n - 1;
queue[rear++] = r;/*3 根结点进队*/
while(1) {
p = queue[front++];/*4 将队首出队到p*/
if(listLength == 0) { /*5 如果表为空,则返回1(真)*/
flag = 1;
break;
}
for(i = 0; i < listLength && list[i][0] != p; i++); /*寻找第一项等于p的边i*/
if(i == listLength) {/*如果没有找到,返回0(假)*/
flag = 0;
break;
}
queue[rear++] = list[i][1];/*将边i的第二项进队*/
for(; i < listLength - 1; i++)/*删除边i*/
list[i][0] = list[i + 1][0], list[i][1] = list[i + 1][1];
listLength--;
if(listLength == 0) { /*6 若表为空,返回1(真)*/
flag = 1;
break;
}
for(i = 0; i < listLength && list[i][1] != p; i++);/*在表中查找第二项等于p的边i*/
if(i == listLength) { /*如果没有找到,返回0(假)*/
flag = 0;
break;
}
queue[rear++] = list[i][0]; /*将边i的第一项进队*/
for(; i < listLength - 1; i++)/*删除边i*/
list[i][0] = list[i + 1][0], list[i][1] = list[i + 1][1];
listLength--;
}/*7 跳到4*/
if(flag)
printf("yes
");
else
printf("no
");
}
运行结果
❸ 判断是否为完全二叉树
建立二叉树有点复杂,可以找书看看,一般数据结构的书上是会有的吧。
判断是否完全二叉树的代码如下(直接根据完全二叉树定义编写的):
//假设之前定义的二叉树的节点类型为struct BT_Node。
/*下面的函数判断子树sub_root是否为完全二叉树,是则返回true,否则返回false.同时,将子树的高度通过pHight返回。这是一个辅助函数。
*/
bool __IsBalanced(BT_Node* sub_root,int *pHight)
{
int lHight,rHight;//左、右子树的高度。
bool result1,result2;
if(sub_root == NULL){
*pHight = 0;
return true;
}
result1 = __IsBalanced(sub_root->lChild,&lHight);
result2 = __IsBalanced(sub_root->rChild,&rHight);
*pHight = 1 + (lHight>rHight? lHight: rHight);
if(result1 && result2 && lHight == rHight)
return ture;
else
return false;
}
///下面的函数判断二叉树root是否完全二叉树。
bool IsBalanced(BT_Node* root)
{
int hight;
return __IsBalanced(root,&hight);
}
❹ 数据结构,完全二叉树问题(用C语言)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct node
{
int elem;
struct node *lch,*rch;
}Bnode;
Bnode *creat()
{
Bnode *root =NULL;
Bnode *s[20];
int i,x;
int j;
printf("input i and x:");
scanf("%d,%d",&i,&x);
while(i != 0)
{
Bnode *p = (Bnode *)malloc(sizeof(Bnode));
p->elem = x;
p->lch = NULL;
p->rch = NULL;
s[i] = p;
if(i == 1)root=p;
else
{
j = i/2;
if(i%2 == 0) //编号为偶数
s[j]->lch = p;
else
s[j]->rch = p;
}
printf("input i and x:");
scanf("%d,%d",&i,&x);
}
return root;
}
void anceng(Bnode *p) //按层遍历
{
Bnode *q = p;
Bnode *s[20];
int front = 0;
int rear = 0;
if(q != NULL)
{
rear++;
s[rear] = q;
}
while(rear != front)
{
front++;
p = s[front];
printf("%d\n",p->elem);
if(p->lch != NULL)
{
rear++;
s[rear] = p->lch;
}
if(p->rch != NULL)
{
rear++;
s[rear] = p->rch;
}
}
}
void zhonggen(Bnode *p) //非递归中根遍历
{
Bnode *q = p;
Bnode *s[20];
int top = 0;
int flag = 1;
do
{
while(q != NULL)
{
top++;
s[top] = q;
q = q->lch;
}
if(top == 0)flag = 0;
else
{
q = s[top];
top--;
printf("%d\n",q->elem);
q = q->rch;
}
}
while(flag);
}
void postorder(Bnode *p) //递归后根遍历
{
if(p!= NULL)
{
postorder(p->lch);
postorder(p->rch);
printf("%d\n",p->elem);
}
}
void inorder(Bnode *p) //递归中根遍历
{
if(p!= NULL)
{
inorder(p->lch);
printf("%d\n",p->elem);
inorder(p->rch);
}
}
void preorder(Bnode *p) //递归先根遍历
{
if(p!= NULL)
{
printf("%d\n",p->elem);
preorder(p->lch);
preorder(p->rch);
}
}
int main(void)
{
int tmp;
int i = 0;
int choice;
Bnode *root;
do
{
printf("\n");
printf("1.creat\n");
printf("2.先序遍历\n");
printf("3.中序遍历\n");
printf("4.后序遍历\n");
printf("5.中根遍历\n");
printf("6.按层遍历\n");
printf("0.exit\n");
printf("input your choice:");
scanf("%d",&choice);
switch(choice)
{
case 1:
root = creat();
break;
case 2:
preorder(root);
break;
case 3:
inorder(root);
break;
case 4:
postorder(root);
break;
case 5:
zhonggen(root);
break;
case 6:
anceng(root);
break;
case 0:
break;
}
}while(choice);
return 0;
}
此代码有创建和遍历的各种算法,遍历有按层遍历,各种递归遍历和非递归遍历。希望对楼主有帮助。
望采纳!!
❺ c语言判断是否为完全二叉树
如果是满二叉树不就找不到只有一个孩子的结点了吗。。。。。。。。
好像排除掉这个就可以了,个人看法,我数据结构倒不很好。
❻ 数据结构 c语言 判断一棵二叉树是完全二叉树的函数
课本上的概念说得比较难懂,用比较通俗的话说就是:除了最底层外,其他各层都是满的,而且最底层是从右往左连续缺若干个结点。就是说你在最后一层从左往右看时不会是在中间突然少了个结点,一旦缺一个结点,这一层在它右边的就全空了。
❼ 数据结构算法,用C语言,判断一个二叉树是不是完全二叉树,求大神....不要文字描述的,要代码
数据结构的书上有……以前我学《数据结构》的时候课本上就有
❽ 怎样判断一棵二叉树为完全二叉树是完全二叉树不是满二叉树!(用C语言)
满二叉树:深度为K,且有结点个数2的K次方减1
完全二叉树:深度为K,有N个结点的二叉树,当且仅当每一个结点都与
深度为K的满二叉树中编号从1到N的结点一一对应(最多一层不满)
❾ 怎么判断是否是完全二叉树 用C++或C语言
你可以上网先找一个用队列实现二叉树的广度优先搜索的代码,然后在代码中增加一个标志变量tag,初始化为0。然后找到代码中访问结点的那句代码,在那句代码处增加
if(tag==0)
判断该结点是否有两个孩子,如果没有两个孩子,则将tag=1
else
判断该结点是否为叶结点,如果不是叶结点,则不是完全二叉树。