数据结构树和二叉树实验报告文档格式.docx
《数据结构树和二叉树实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构树和二叉树实验报告文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
(6)输出二叉树b的叶子结点个数。
2.编写一程序,实现二叉树的先序遍历、中序遍历和后序遍历的各种递归和非递归算法,以及层次遍历的算法。
三、实验预习内容
二叉树存储结构,二叉树基本运算(创建二叉树、寻找结点、找孩子结点、求高度、输出二叉树)
三、实验结果与分析
7-1
#include<
stdio.h>
malloc.h>
#defineMaxSize100
typedefcharElemType;
typedefstructnode
{
ElemTypedata;
structnode*lchild;
structnode*rchild;
}BTNode;
voidCreateBTNode(BTNode*&
b,char*str)
BTNode*St[MaxSize],*p=NULL;
inttop=-1,k,j=0;
charch;
b=NULL;
ch=str[j];
while(ch!
='
\0'
)
{
switch(ch)
{
case'
('
:
top++;
St[top]=p;
k=1;
break;
)'
top--;
break;
'
k=2;
default:
p=(BTNode*)malloc(sizeof(BTNode));
p->
data=ch;
p->
lchild=p->
rchild=NULL;
if(b==NULL)
b=p;
else
{
switch(k)
{
case1:
St[top]->
lchild=p;
case2:
rchild=p;
}
}
}
j++;
ch=str[j];
}
}
BTNode*FindNode(BTNode*b,ElemTypex)
BTNode*p;
if(b==NULL)
returnNULL;
elseif(b->
data==x)
returnb;
else
{
p=FindNode(b->
lchild,x);
if(p!
=NULL)
returnp;
else
returnFindNode(b->
rchild,x);
BTNode*LchildNode(BTNode*p)
returnp->
lchild;
BTNode*RchildNode(BTNode*p)
rchild;
intBTNodeDepth(BTNode*b)
intlchilddep,rchilddep;
if(b==NULL)
return(0);
lchilddep=BTNodeDepth(b->
lchild);
rchilddep=BTNodeDepth(b->
rchild);
return(lchilddep>
rchilddep)?
(lchilddep+1):
(rchilddep+1);
voidDispBTNode(BTNode*b)
if(b!
=NULL)
printf("
%c"
b->
data);
if(b->
lchild!
=NULL||b->
rchild!
printf("
("
);
DispBTNode(b->
if(b->
=NULL)printf("
"
)"
intBTWidth(BTNode*b)
struct
intlno;
BTNode*p;
}Qu[MaxSize];
intfront,rear;
intlnum,max,i,n;
front=rear=0;
rear++;
Qu[rear].p=b;
Qu[rear].lno=1;
while(rear!
=front)
front++;
b=Qu[front].p;
lnum=Qu[front].lno;
=NULL)
{
rear++;
Qu[rear].p=b->
Qu[rear].lno=lnum+1;
}
max=0;
lnum=1;
i=1;
while(i<
=rear)
n=0;
while(i<
=rear&
&
Qu[i].lno==lnum)
n++;
i++;
lnum=Qu[i].lno;
if(n>
max)max=n;
returnmax;
return0;
intNodes(BTNode*b)
intnum1,num2;
if(b==NULL)
lchild==NULL&
b->
rchild==NULL)
return1;
num1=Nodes(b->
num2=Nodes(b->
return(num1+num2+1);
intLeafNodes(BTNode*b)
num1=LeafNodes(b->
num2=LeafNodes(b->
return(num1+num2);
voidmain()
BTNode*b,*p,*lp,*rp;
;
CreateBTNode(b,"
A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))"
printf("
输出二叉树:
"
DispBTNode(b);
printf("
\n"
'
H'
结点:
p=FindNode(b,'
if(p!
lp=LchildNode(p);
if(lp!
左孩子为%c"
lp->
else
无左孩子"
rp=RchildNode(p);
if(rp!
右孩子为%c"
rp->
无右孩子"
二叉树b的深度:
%d\n"
BTNodeDepth(b));
二叉树b的宽度:
BTWidth(b));
二叉树b的结点个数:
Nodes(b));
二叉树b的叶子结点个数:
LeafNodes(b));
7-2
voidPreOrder(BTNode*b)
%c"
PreOrder(b->
voidPreOrder1(BTNode*b)
BTNode*St[MaxSize],*p;
inttop=-1;
top++;
St[top]=b;
while(top>
-1)
p=St[top];
top--;
p->
if(p->
St[top]=p->
voidInOrder(BTNode*b)
InOrder(b->
voidInOrder1(BTNode*b)
p=b;
while(top>
-1||p!
while(p!
top++;
St[top]=p;
p=p->
if(top>
-1)
p=St[top];
top--;
printf("
voidPostOrder(BTNode*b)
PostOrder(b->
voidPostOrder1(BTNode*b)
BTNode*St[MaxSize];
intflag,top=-1;
do
while(b!
St[top]=b;
b=b->
p=NULL;
flag=1;
while(top!
=-1&
flag)
b=St[top];
if(b->
rchild==p)
{
printf("
top--;
p=b;
}
else
b=b->
flag=0;
}while(top!
=-1);
}
voidLevelOrder(BTNode*b)
{BTNode*p;
BTNode*qu[MaxSize];
front=rear=-1;
rear++;
qu[rear]=b;
while(front!
=rear)
{front=(front+1)%MaxSize;
p=qu[front];
if(p->
{rear=(rear+1)%MaxSize;
qu[rear]=p->
BTNode*b;
二叉树b:
先序遍历序列:
递归算法:
PreOrder(b);
非递归算法:
PreOrder1(b);
中序遍历序列:
InOrder(b);
InOrder1(b);
后序遍历序列:
PostOrder(b);
PostOrder1(b);
层次遍历序列:
LevelOrder(b);
注:
空间不够,可以增加页码。