数据结构实验报告2Word文件下载.docx
《数据结构实验报告2Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告2Word文件下载.docx(15页珍藏版)》请在冰豆网上搜索。
stack>
queue>
usingnamespacestd;
typedefintElemType;
typedefstructBiTreeNode
{
ElemTypedata;
structBiTreeNode*lchild,*rchild;
}BiTNode,*BiTree;
printlist(BiTreer)//以广义表的形式输出二叉树
{
inti=1;
if(r!
=NULL)
{
cout<
<
"
("
;
r->
data;
printlist(r->
lchild);
rchild);
)"
}
}
BiTreefind(BiTreep,intpvalue)//寻值
BiTreeq;
if(p==NULL)
return(NULL);
elseif(p->
data==pvalue)
return(p);
else{
q=find(p->
lchild,pvalue);
if(q==NULL)return(find(p->
rchild,pvalue));
elsereturn(q);
BiTreecreat(BiTree&
head)//创建二叉树
intcvalue,i=1,pvalue,type;
BiTrees,p,q;
endl;
请输入想要建立的二叉树的根结点:
"
cin>
>
cvalue;
if(cvalue!
=-1)
{
head=(BiTree)malloc(sizeof(BiTNode));
head->
data=cvalue;
lchild=NULL;
rchild=NULL;
else
do{
cout<
请输入第"
i++<
个你想寻找的双亲结点:
cin>
pvalue;
if(pvalue!
do{
cout<
请输入结点类型0或1(0表示左,1表示右):
cin>
type;
}while(type!
=0&
&
type!
=1);
请输入你想创建的结点:
p=head;
q=find(p,pvalue);
if(q!
s=(BiTree)malloc(sizeof(BiTNode));
s->
if(type==0)q->
lchild=s;
elseq->
rchild=s;
}
else
cout<
没有双亲结点!
i--;
}while(pvalue!
=-1);
return(head);
voidLevelOrder(BiTree&
T)//层序遍历
BiTreep=T;
queue<
BiTree>
q;
q.push(p);
while(!
q.empty())
p=q.front();
p->
data<
q.pop();
if(p->
lchild!
q.push(p->
rchild!
}
voidPreOrder(BiTree&
T)//递归前序遍历
BiTNode*p=T;
if(T!
PreOrder(p->
voidInOrder(BiTree&
T)//递归中序遍历
{//递归中序遍历
{
InOrder(p->
voidPostOrder(BiTree&
T)//递归后序遍历
PostOrder(p->
voidPreOrder2(BiTree&
T)//非递归前序遍历
{
stack<
s;
while(p||!
s.empty())
if(p!
s.push(p);
p=p->
lchild;
p=s.top();
s.pop();
rchild;
voidInOrder2(BiTree&
T)//非递归中序遍历
intmain()
BiTreep;
creat(p);
层序遍历:
LevelOrder(p);
递归前序遍历:
PreOrder(p);
递归中序遍历:
InOrder(p);
递归后序遍历:
PostOrder(p);
非递归前序遍历:
PreOrder2(p);
非递归中序遍历:
InOrder2(p);
用广义表显示的二叉树为:
printlist(p);
return0;
4、重要函数功能说明
1、printlist(BiTreer)以广义表的形式输出二叉树函数
2、BiTreefind(BiTreep,intpvalue)寻值函数
3、BiTreecreat(BiTree&
head)二叉树创建函数
4、voidLevelOrder(BiTree&
T)层序遍历函数
5、voidPreOrder(BiTree&
T)递归前序遍历函数
6、voidInOrder(BiTree&
T)递归中序遍历函数
7、voidPostOrder(BiTree&
T)递归后序遍历函数
8、voidPreOrder2(BiTree&
T)非递归前序遍历函数
9、voidInOrder2(BiTree&
T)非递归中序遍历函数
5、程序运行结果
建立的二叉树如下:
六、实验中遇到的问题、解决及体会
1、刚开始,我不知道应该怎样建立二叉树,怎样将双亲与孩子联系起来,才能使程序运行时清晰明朗,不会使双亲与孩子的关系弄错,后来经过思考,我想到建立二叉树输入结点时可以提示要建立哪个双亲的孩子,从键盘输入双亲结点,就不会使其与孩子的关系弄错,同时选择0表示左孩子,1表示右孩子,这样一来如果之前,某个有左右孩子的双亲只建立了左孩子,而忘了建立右孩子,可以在后面进行补充,就使使用更方便了,并且最后输入-1,就表示二叉树建立结束。
比如:
建立如上图所示二叉树,当我把1的左右孩子结点2、3建立后,我只建立了2的右孩子结点5,然后再建立了3的左右孩子结点6、7,忘记了建立2的左孩子结点,但是我可以在最后建立2的左孩子结点4,这就使得程序更加方便灵活。
2、老师要求用非递归算法编写前序遍历函数和中序遍历函数,还要以广义表的形式输出二叉树,起初我是完全没有想法的,于是我只好询问同学,同时还上网搜索相关信息,最终经过长时间的修改和多次调试,终于编写出了正确的程序可以实现老师要求的功能,这让我懂得在完全没有头绪的情况下,我们是可以寻求他人帮助和借助电脑等资源的。
相关功能函数:
程序运行部分截图:
3、当我编写好能实现老师要求的所有功能的程序后,我多次运行程序,意外发现当我输入的结点值不是个位数时,遍历的结果很混乱,很不清楚,我意识到我遍历后的输出是直接一行连续输出所有结点,导致遍历结果不清楚,不知道到底是哪些结点值,于是我在每一次输出一个结点后,让其再输出一个空格,这样的话,遍历后输出的结果就很清晰明朗了。
这让我懂得即使写好了程序,也要多次以不同的方式、形式运行程序,这样才能发现潜在的问题,对程序进行优化。
修改前遍历函数中的输出都为“cout<
”,
修改后遍历函数中的输出都为“cout<
”。
建立的二叉树如下:
修改前部分截图:
修改后部分截图: