数据结构,完全二叉树问题(用C语言)

数据结构,完全二叉树问题(用C语言)。要求:
(1)创建一个有n个结点的二叉树链存储结构完全二叉树。
(2)判断该二叉树是否为完全二叉树。
(3)创建一个有n个结点的二叉链存储结构非完全二叉树,并判断该二叉树是否为完全二叉树。

第1个回答  推荐于2017-12-16
#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;
}

此代码有创建和遍历的各种算法,遍历有按层遍历,各种递归遍历和非递归遍历。希望对楼主有帮助。
望采纳!!追问

可是,为什么会这样呢

追答

我这里运行是对的,得先create一个完全二叉树,然后才能进行遍历,都没建立树,你遍历什么啊?

本回答被提问者和网友采纳

数据结构中用c语言建立二叉树的程序
include "stdio.h"include "stdlib.h"include "malloc.h"typedef struct Bnode \/\/二叉树节点类型 { int m;struct Bnode *Lchild,*Rchild;}Btnode, *BTptr;typedef struct Dnode \/\/队列节点类型 { Btnode *pr;struct Dnode *next;}Qnode,*Qlink;typedef struct \/\/q节点类型 { Qnod...

数据结构(C语言版),求高手解决。。
6.用二叉链表存储n个结点的二叉树时,结点的2n个指针中有n+1个空指针( )【答案】√ 7.完全二叉树的存储结构通常采用顺序存储结构( )【答案】√ 8.哈夫曼树是带权路径长度最短的树,路径上权值较大的结点离根较近( )【答案】√ 9.在中序线索二叉树中,每一非空的线索均指...

C语言 什么叫完全二叉树?
完全二叉树是一种特殊的二叉树。定义:如果一棵具有n个结点的深度为k的二叉树,它的每一个结点都与深度为k的满二叉树中编号为1~n的结点一一对应,这棵二叉树称为完全二叉树。例:特点:叶子结点只可能在最大的两层上出现,对任意结点,若其右分支下的子孙最大层次为L,则其左分支下的子孙的最大...

数据结构完全二叉树问题
完全二叉树叶子结点可以出现在最下两层 设根结点层次为1,完全二叉树第9层有200个叶子,第9层结点个数最多就是满二叉树,共有2^(9-1)=256个结点,因此第9层并不都是叶子 考虑到是计算最多结点,因此,可以认为第9层不是最下层,也就是说该完全二叉树的高度为10,第9层剩下的256-200=56个...

数据结构中关于用c++语言建立二叉树的问题,求代码,急!!!
printf("%c",root->data);\/*输出结点*\/ } } void main(){ BiTree T;printf("建立二叉树,请输入序列:\\n");CreateBiTree(&T);printf("\\n输出前序序列为:");preOrder(T);printf("\\n输出中序序列为:");inOrder(T);printf("\\n输出后序序列为:");postOrder(T);getch();} (2)i...

求数据结构树与二叉树转换C语言代码
5.普通树转换成二叉树:凡是兄弟就用线连起来,然后去掉父亲到儿子的连线,只留下父母到其第一个子女的连线。二叉树很象一株倒悬着的树,从树根到大分枝、小分枝、直到叶子把数据联系起来,这种数据结构就叫做树结构,简称树。树中每个分叉点称为结点,起始结点称为树根,任意两个结点间的连接关系称...

数据结构与算法分析 —— C 语言描述:二叉树
因为一棵二叉树最多有两个儿子,所以我们可以用指针直接指向它们。树节点的声明在结构上类似于双链表的声明,在声明中,一个节点就是由 key(关键字)信息加上两个指向其他节点的指针(Left 和 Right)组成的结构。应用于链表上的许多法则也可以应用到树上。特别地,当进行一次插入时,必须调用 malloc ...

关于数据结构C语言二叉树的程序,请人帮忙看看~谢谢
status DLR(BiTree root) \/\/void类型是不能返回值的,所以你可以把函数改成status类型;函数参数不用引用。因为没有改变参数值,只是使用 { if(root!=NULL){ printf("%c",root->data);DLR(root->lchild);DLR(root->rchild); \/\/这一点属于严重错误,说明你没有弄清递归遍历的过程。是先根,...

数据结构问题:一棵完全二叉树有100个结点,度为一的结点有几个,叶子结...
如果叶子节点数为n0,度为2的结点数为n2,则no=n2+1.根据完全二叉树的定义可得:在完全二叉树中度为1的结点n1只能取两种情况,要么为0,要么为1. 所以:n0+n1+n2=100 又n0=n2+1; 2n2=99-n1; 因为结点数为整数,所以n1=1,n2=49,n0=50 所以度为1的结点有一个,叶子结点有50个 ...

c语言二叉树问题,勿写代码,求详细思考过程
中序遍历:若树不空,则先访问左子树,再访问根,再访问右子树。从后序遍历:CDABE得出E是最顶根节点。然后中序遍历:CADEB得出CAD是E的左子树中的,B是E的右子树中的。再分析后序遍历CDA可以知道A是CD的根,而中序是CAD得到C是A的左子树,D是A的右子树。(如下图)最后,先序遍历:若树...

相似回答