二叉树的建立及遍历25246Word格式文档下载.docx
- 文档编号:22015614
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:14
- 大小:36.03KB
二叉树的建立及遍历25246Word格式文档下载.docx
《二叉树的建立及遍历25246Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《二叉树的建立及遍历25246Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
WindowsXP系统,Vc6软件
五、算法实现及步骤
实现的主要算法:
(1)首先定义二叉树的存储形式,这里使用了二叉链表
typedefstructNode//创建结点类型结构体
{DataTypedata;
structNode*LChild;
structNode*RChild;
}BitNode,*BitTree;
(2)建立一个二叉树
voidCreatBiTree(BitTree*bt)//用扩展前序遍历序列创建二叉树如果是当前树根置为空否则申请一个新节点//
{charch;
ch=getchar();
if(ch=='
.'
)*bt=NULL;
else
{*bt=(BitTree)malloc(sizeof(BitNode));
(*bt)->
data=ch;
CreatBiTree(&
((*bt)->
LChild));
RChild));
}}
(3)建立递归方法二叉树的前序、中序、后序遍历
voidPreOrder(BitTreeroot)//前序遍历二叉树的递归算法
{if(root!
=NULL)
{visit(root->
data);
PreOrder(root->
LChild);
RChild);
}}
voidInOrder(BitTreeroot)//中序遍历二叉树的递归算法
{InOrder(root->
visit(root->
InOrder(root->
voidPostOrder(BitTreeroot)//后序遍历求二叉树的递归算法
{if(root!
{PostOrder(root->
PostOrder(root->
visit(root->
}}
(4)建立非递归方法二叉树的前序、中序、后序遍历
voidpreOrder2(BinTree*root)//非递归前序遍历
{stack<
BinTree*>
s;
BinTree*p=root;
while(p!
=NULL||!
s.empty())
{while(p!
=NULL)
{cout<
<
p->
data<
"
;
s.push(p);
p=p->
lchild;
}if(!
{p=s.top();
s.pop();
rchild;
}}}
voidinOrder2(BinTree*root)//非递归中序遍历
BinTree*p=root;
{s.push(p);
cout<
s.pop();
rchild;
}}}
voidpostOrder2(BinTree*root)//非递归后序遍历
BTNode*>
BTNode*temp;
while(p!
{while(p!
=NULL)//沿左子树往下搜索,直至出现没有左子树的结点
{BTNode*btn=(BTNode*)malloc(sizeof(BTNode));
btn->
btnode=p;
isFirst=true;
s.push(btn);
}if(!
{temp=s.top();
if(temp->
isFirst==true)//表示是第一次出现在栈顶
{temp->
isFirst=false;
s.push(temp);
p=temp->
btnode->
}else//第二次出现在栈顶
temp->
p=NULL;
}}}}
六、实验结果
递归方法的遍历结果:
非递归方法的遍历结果:
七、心得体会
通过这次实验,让我对树有了更深入的认识,不仅再次熟悉了树以及二叉树的存储结构:
顺序存储结构,链式存储结构;
而且更加清楚二叉树的遍历原理以及三种遍历方法。
在这次实验中,多次应用到了递归,这样让我进一步掌握了递归的算法思想。
然而在输入二叉树中的元素时,只能按设定的前序遍历的次序输入合法的结点的值,不然程序无法进行。
总的来说,通过这次实验,让我对树有了更多的认识,明白书本上的程序一定要自己去调试,这样才能将书本程序与老师讲的内容融会贯通,达到温故而知新。
主程序源代码:
递归方法:
#include<
stdio.h>
stdlib.h>
#include<
malloc.h>
conio.h>
typedefintDataType;
}
BitNode,*BitTree;
ch=getchar();
if(ch=='
else
(*bt)->
}
}
voidvisit(charch)//访问根节点
{printf("
%c"
ch);
}
}voidPostOrder(BitTreeroot)//后序遍历求二叉树的递归算法
voidmain()
{
BitTreeT;
intlayer;
layer=0;
printf("
请输入二叉树中的元素(以扩展前序遍历序列输入,其中.代表空子树):
\n"
);
T);
printf("
前序遍历序列为:
PreOrder(T);
\n中序遍历序列为:
InOrder(T);
\n后序遍历序列为:
PostOrder(T);
非递归方法
iostream>
string.h>
stack>
usingnamespacestd;
typedefstructnode
{chardata;
structnode*lchild,*rchild;
}BinTree;
typedefstructnode1
BinTree*btnode;
boolisFirst;
}BTNode;
voidcreatBinTree(char*s,BinTree*&
root)//创建二叉树,s为形如A(B,C(D,E))形式的字符串
inti;
boolisRight=false;
stack<
s1;
//存放结点
char>
s2;
//存放分隔符
BinTree*p,*temp;
root->
data=s[0];
lchild=NULL;
rchild=NULL;
s1.push(root);
i=1;
while(i<
strlen(s))
{
if(s[i]=='
('
)
s2.push(s[i]);
isRight=false;
elseif(s[i]=='
'
)
isRight=true;
)'
s1.pop();
s2.pop();
elseif(isalpha(s[i]))
p=(BinTree*)malloc(sizeof(BinTree));
p->
data=s[i];
temp=s1.top();
if(isRight==true)
temp->
rchild=p;
的右孩子是"
s[i]<
endl;
else
lchild=p;
的左孩子是"
if(s[i+1]=='
s1.push(p);
}i++;
voiddisplay(BinTree*root)//显示树形结构
if(root!
root->
data;
if(root->
lchild!
'
display(root->
lchild);
rchild!
{
rchild);
if(!
p=s.top();
}}
=NULL)//沿左子树一直往下搜索,直至出现没有左子树的结点
BTNode*btn=(BTNode*)malloc(sizeof(BTNode));
temp=s.top();
else//第二次出现在栈顶
intmain(intargc,char*argv[])
chars[100];
while(scanf("
%s"
s)==1)
BinTree*root=(BinTree*)malloc(sizeof(BinTree));
creatBinTree(s,root);
preOrder2(root);
中序遍历序列为:
inOrder2(root);
后序遍历序列为:
postOrder2(root);
return0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉 建立 遍历 25246