二叉树的建立和遍历实验报告文档格式.docx
《二叉树的建立和遍历实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《二叉树的建立和遍历实验报告文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
5、求二叉树的叶子结点个数。
在程序运行窗口的主控菜单中选择“5”并回车,在会得到结果为:
该二叉树的叶子结点数为:
3
6、将二叉树左右子树交换(此处我用交换后的中序遍历来检验是否成功)。
在程序运行窗口的主控菜单中选择“6”并回车.得到结果为:
该二叉树的左右节点已交换成功,其中序遍历序列是:
afdgebc
7、退出程序。
在程序运行窗口的主控菜单中选择“0”并回车。
退出程序。
二、设计
1、设计思想
在二叉树上无论采用哪种遍历方法,都能够访问遍树中的所有结点。
由于访问结点的顺序不同,前序遍历和中序遍历都很难达到设计的要求(求路径);
但采用后序遍历二叉树是可行的,因为后序遍历是最后访问根结点,按这个顺序将访问过的结点存储到一个顺序栈中,然后再输出即可。
因此,我们可以非递归地后序遍历二叉树T,当后序遍历访问到结点*p时,此时栈中存放的所有结点均为给定结点*p的祖先,而由这些祖先便构成了一条从根结点到结点*p之间的路径。
而求二叉树的深度和叶子结点数可以直接判断结点孩子的数目来完成,将二叉树的左右子树交换也可以利用递归的方法,交换左右孩子来实现。
2、设计表示
为实现上述的设计思想,首先要定义二叉树的链式存储结构,我们采用二叉链表的方式,相应的类型说明为:
typedefcharDataType;
typedefstructnode{
DataTypedata;
structnode*lchild,*rchild;
}BinTNode,*BinTree;
函数接口说明:
StatusCreateBiTree(BinTree&
bt)//1,按照先序遍历次序递归建立二叉树
StatusInorder(BinTreebt)//2,二叉树非递归中序遍历算法*/
BinTreeNodePath(BinTreebt,BinTNode*ch)//3,求二叉树根结点到给定结点*p的路径
intDepth(BinTreebt)//4.求二叉树的深度
intLeaf(BinTreebt)//5.求二叉树的叶子结点个数
BinTNode*huhuan(BinTNode*p)//将p指针指向的二叉树的左右子树进行互换
函数调用关系如图所示:
三、实现注释
二叉树的创建模块:
按照先序遍历次序递归建立二叉树,通过读入的字符,分配存储空间生成新结点后再逐个构建根结点、左子树和右子树。
二叉树中序遍历模块:
采用非递归中序遍历算法,先逐步扫描二叉树的左子树,并压入堆栈,如果栈不为空,左子树为空,则弹出栈顶的一个元素并输出。
然后再扫描右子树,然后再重复上面的步骤扫描该分支的左子树,直至整棵二叉树都扫描完成。
此时输出的序列便是该二叉树的中序遍历序列。
语句注释见代码。
二叉树指定结点路径模块:
该模块由NodePath、FindBT、Findx三个函数体构成,main函数通过先调用Findx函数来查找结点,Findx又通过逐步调用FindBT函数遍历查找结点的路径,最后main函数再通过调用NodePath函数得到给定结点的路径。
该模块需定义全局变量p和found以方便查找,否则容易出错,出错情况见调试报告。
求二叉树的深度模块:
通过判断左右孩子结点是否存在,如存在(h不等于零),则有一个孩子h加一,然后比较左右孩子结点数大小,较大的为树的深度。
具体见代码。
求二叉树的叶子结点个数模块:
判断左右子树的叶子结点是否存在,如存在,则记下,左后返回左右子树叶子结点的和。
二叉树的左右子树进行互换模块:
通过指针p指定结点,然后用递归的方法将其孩子结点互换。
四、调试报告
编程的最初阶段,在case4语句中,缺少break,使得每次执行case4的时候,自动弹出该二叉树的叶子节点数,经过调试后发现,原来是缺少了break,补上之后,程序正常运行。
其实这只是很小的问题!
在调试中,还有很多的问题,如果在这里一一列举,恐怕很难写完。
具体的看运行结果吧。
五、程序清单
#include<
stdio.h>
stdlib.h>
#definenum100
#defineOK1
typedefintStatus;
intfound;
BinTNode*p;
bt)//1.按照先序遍历次序递建立二叉树。
{//ABC@@DE@G@@F@@@以@代替空格。
但是程序中直接输入空格。
charch;
printf("
ch="
);
scanf("
%c"
&
ch);
getchar();
if(ch=='
'
)bt=NULL;
//程序中直接输入空格,不用以@代替空格。
else
{bt=(BinTNode*)malloc(sizeof(BinTNode));
bt->
data=ch;
//生成根结点
CreateBiTree(bt->
lchild);
//构造左子树
rchild);
//构造右子树
}returnOK;
}
StatusInorder(BinTreebt)//二叉树非递中序遍历算法
{BinTNode*stack[num];
//定义栈数组
inttop=0;
//初始化栈
stack[top]=bt;
do
{while(NULL!
=stack[top])//扫描根结点及其所有的左结点并入栈
{top=top+1;
stack[top]=stack[top-1]->
lchild;
}
top=top-1;
//退栈
if(top>
=0)//判断栈是否为空
{printf("
stack[top]->
data);
//访问结点
stack[top]=stack[top]->
rchild;
//扫描右子树
}while(top>
=0);
returnOK;
BinTreeNodePath(BinTreebt,BinTNode*ch)//3.求二叉树指定结点的路径
{typedefenum{FALSE,TRUE}boolean;
BinTNode*stack[num];
//定义栈
inti,top,tag[num];
booleanfind;
BinTNode*s;
find=FALSE;
//初始化
top=0;
s=bt;
do
{while(s!
=NULL)
{top++;
stack[top]=s;
tag[top]=0;
s=s->
}
if(top>
0)
{s=stack[top];
if(tag[top]==1)
{if(s==ch)
{for(i=1;
i<
=top;
i++)
printf("
->
stack[i]->
find=TRUE;
}elsetop--;
s=stack[top];
}//endif
0&
&
!
find)
{if(tag[top]!
=1)
{s=s->
//扫描右子树
tag[top]=1;
}elses=NULL;
}//endif
}//endif
}while(!
find&
top!
returns;
}
voidFindBT(BinTreebt,DataTypex)
{if((bt!
=NULL)&
found)
{if(bt->
data==x)
{p=bt;
found=1;
}else
{FindBT(bt->
lchild,x);
FindBT(bt->
rchild,x);
}
BinTNode*Findx(BinTreebt,DataTypex)
{intfound=0;
BinTreep=NULL;
FindBT(bt,x);
return(p);
{inth,lh,rh;
if(bt==NULL)h=0;
{lh=Depth(bt->
rh=Depth(bt->
if(lh>
=rh)h=lh+1;
elseh=rh+1;
}returnh;
}//Depth
intLeaf(BinTreebt)//5.求二叉树的叶子结点个数
{if(bt==NULL)return0;
elseif(bt->
lchild==NULL&
bt->
rchild==NULL)
return1;
elsereturnLeaf(bt->
lchild)+Leaf(bt->
}//Leaf
BinTNode*huhuan(BinTNode*p)
//将p指针指向的二叉树的左右子树进行互换。
{BinTNode*stack[num];
//指针类型的堆栈
intk=0;
stack[k]=NULL;
if(p!
=NULL)//交换p结点的左右孩子
{k++;
stack[k]=p->
p->
lchild=p->
rchild=stack[k];
lchild=huhuan(p->
rchild=huhuan(p->
}return(p);
voidmain()
{BinTreebt;
//BinTNode*root;
charch1;
intxz=1,sd=0,yz=0;
while(xz)
{printf("
建立二叉树并求指定结点路径\n"
printf("
============================\n"
1.建立二叉树的存储结构\n"
2.求解二叉树的中序遍历\n"
3.求二叉树指定结点的路径\n"
4.求二叉树的深度\n"
5.求二叉树的叶子结点个数\n"
6.将二叉树左右子树交换\n"
0.退出系统\n"
请选择:
(0-6)\n"
scanf("
%d"
xz);
getchar();
switch(xz)
{//输入:
ABC@@DE@G@@F@@@输出:
CBEGDFA
case1:
printf("
输入二叉树的先序序列结点值:
\n"
CreateBiTree(bt);
printf("
break;
case2:
Inorder(bt);
case3:
printf("
请输入要求路径的结点值:
);
ch1=getchar();
p=NULL;
found=0;
Findx(bt,ch1);
if(p!
NodePath(bt,p);
else
printf("
没有要求的节点!
\n"
case4:
sd=Depth(bt);
%d\n"
sd);
printf("
case5:
yz=Leaf(bt);
该二叉树的叶子节点数为:
\n%d\n"
yz);
case6:
bt=huhuan(bt);
该二叉树的左右结点已交换成功,其中序遍历序列
是:
Inorder(bt);
}//switch
}//while
六、运行结果截图
参考文献:
[1]严蔚敏,吴伟民.数据结构(C语言版).北京:
清华大学出版社,2010
[2]严蔚敏,吴伟民等.数据结构题集(C语言版).北京:
[3]苏仕华等.数据结构程设计.北京:
机械工业出版社,2008