数据结构实验3二叉树
return0;
}
else
{
Q->front=(Q->front+1)%MAXSIZE;
*x=Q->data[Q->front];
return1;
}
}
voiddestory_seqqueue(Pseqqueue*Q)
{
if(*Q)
free(*Q);
*Q=NULL;
}
voidPreOrder(BTreet)
一、 实验目的
1. 进一步掌握指针变量的含义。
2. 掌握二叉树的结构特征,以及各种存储结构的特点及使用范围。
3. 掌握用指针类型描述、访问和处理二叉树的运算。
二、 实验要求
1. 认真阅读和掌握本实验的参考程序。
2. 按照对二叉树的操作需要,在创建好二叉树后再通过遍历算法验证创建结果。
3. 保存程序的运行结果,并结合程序进行分析。
}SeqStack,*PSeqStack;
PSeqStackInit(void)
{
PSeqStackS;
S=((PSeqStack)malloc(sizeof(SeqStack)));
if(S)
{
S->top=-1;
returnS;
}
}
intEmpty(PSeqStackS)
{
if(S->top==-1)
{
inth1,h2;
if(t==NULL) return 0;
else
{
h1=Height(t->lchild);
h2=Height(t->rchild);
if(h1>h2) return h1+1;
elsereturn h2+1;
}
}
intmain()
{
BTreeT;
inta=0;
intb=0;
T=create();
return;
}
intleaf(BTreeT)
{
if(T == NULL)
return0;
if(T->lchild== NULL && T->rchild== NULL)
return1;
returnleaf(T->lchild) + leaf(T->rchild);
}
intHeighபைடு நூலகம்(BTreet)
{
if(t)
{
printf("%c",t->data);
PreOrder(t->lchild);
PreOrder(t->rchild);
}
}
voidPostOrder2(BTreet)
{
PSeqStackS;
DataSq;
BTreep=t;
S=Init();
while(p||!Empty(S))
{
if(p)
{
Sq.flag=0;Sq.node=p;
Push(S,Sq);
p=p->lchild;
}
else
{
Pop(S,&Sq);
p=Sq.node;
if(Sq.flag==0)
{
Sq.flag=1;
Push(S,Sq);
p=p->rchild;
}
else
{
printf("%c",p->data);
p=NULL;
}
returnQ;
}
intempty_seqqueue(PseqqueueQ)
{
if(Q&&Q->rear==Q->front)
return1;
else
return0;
}
intin_seqqueue(PseqqueueQ,BTreex)
{
if((Q->rear+1)%MAXSIZE==Q->front)
{
printf("队满");
return-1;
}
else
{
Q->rear=(Q->rear+1)%MAXSIZE;
Q->data[Q->rear]=x;
return0;
}
}
intout_seqqueue(PseqqueueQ,BTree*x)
{
if(empty_seqqueue(Q))
{
printf("队空");
return0;
else
{
*x=S->Data[S->top];
S->top--;
return1;
}
}
Pseqqueueinit_seqqueue(void)
{
PseqqueueQ;
Q=(Pseqqueue)malloc(sizeof(seqqueue));
if(Q)
{
Q->front=0;
Q->rear=0;
while(!empty_seqqueue(q))
{
out_seqqueue(q,&p);
printf("%c",p->data);
if(p->lchild)in_seqqueue(q,p->lchild);
if(p->rchild)in_seqqueue(q,p->rchild);
}
destory_seqqueue(&q);
return1;
else
return0;
}
intPush(PSeqStackS,Datax)
{
if(S->top==MAXSIZE-1)
return0;
else
{
S->top++;
S->Data[S->top]=x;
return1;
}
}
intPop(PSeqStackS,Data*x)
{
if(Empty(S))
typedefstruct{
BTreedata[MAXSIZE];
intfront,rear;
}seqqueue,*Pseqqueue;
typedefstruct{
BNode*node;
intflag;
}Data;
typedefstructnode
{
DataData[MAXSIZE];
inttop;
PostOrder2(T);
printf("\n");
HBiTree(T);
printf("\n");
a=Height(T);
printf("深度为:%d\n",a);
b=leaf(T);
printf("叶子数:%d\n",b);
return0;
}
实验结果如下:
三、 实验内容
以下参考程序是按完全二叉树思想将输入的字符串生成二叉树,并通过遍历来验证二叉树创建正确与否,但不能创建非完全二叉树,请认真研究该程序,然后模仿教材例6.4初始化方式创建二叉树:所有的空指针均用#表示,如教材图6-13对应的二叉树,建立时的初始序列为:AB#D##CE##F##。然后通过遍历算法验证二叉树是否正确(先递归验证后非递归验证)。
}
returnT;
}
voidHBiTree(BTreet)
{
Pseqqueueq;
q=init_seqqueue();
if(t==NULL) return;
BTreep=t;
printf("%c",p->data);
if(p->lchild)in_seqqueue(q,p->lchild);
if(p->rchild)in_seqqueue(q,p->rchild);
参考程序略
程序代码如下:
#include "stdio.h"
#include "stdlib.h"
typedefcharDatatype;
#define MAXSIZE 100
typedefstructbnode
{
Datatypedata;
structbnode*lchild,*rchild;
}BNode,*BTree;
}
}
}
}
BTreecreate()
{
BTreeT;
charc;
scanf("%c",&c);
if('#' == c)
T=NULL;
else
{
T=(BTree)malloc(sizeof(BNode));
T->data = c;
T->lchild=create();
T->rchild=create();