ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:19.28KB ,
资源ID:30729123      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/30729123.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(二叉树的几种遍历.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

二叉树的几种遍历.docx

1、二叉树的几种遍历 二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。一.前序遍历 前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。 1.递归实现void preOrder1(BinTree *root) /递归前序遍历 if(root!=NULL) co

2、utdatalchild); preOrder1(root-rchild); 2.非递归实现 根据前序遍历访问的顺序,优先访问根结点,然后再分别访问左孩子和右孩子。即对于任一结点,其可看做是根结点,因此可以直接访问,访问完之后,若其左孩子不为空,按相同规则访问它的左子树;当访问其左子树时,再访问它的右子树。因此其处理过程如下: 对于任一结点P: 1)访问结点P,并将结点P入栈;2)判断结点P的左孩子是否为空,若为空,则取栈顶结点并进行出栈操作,并将栈顶结点的右孩子置为当前的结点P,循环至1);若不为空,则将P的左孩子置为当前的结点P; 3)直到P为NULL并且栈为空,则遍历结束。void pr

3、eOrder2(BinTree *root) /非递归前序遍历 stack s; BinTree *p=root; while(p!=NULL|!s.empty() while(p!=NULL) coutdatalchild; if(!s.empty() p=s.top(); s.pop(); p=p-rchild; 二.中序遍历 中序遍历按照“左孩子-根结点-右孩子”的顺序进行访问。 1.递归实现void inOrder1(BinTree *root) /递归中序遍历 if(root!=NULL) inOrder1(root-lchild); coutdatarchild); 2.非递归实现

4、根据中序遍历的顺序,对于任一结点,优先访问其左孩子,而左孩子结点又可以看做一根结点,然后继续访问其左孩子结点,直到遇到左孩子结点为空的结点才进行访问,然后按相同的规则访问其右子树。因此其处理过程如下:对于任一结点P, 1)若其左孩子不为空,则将P入栈并将P的左孩子置为当前的P,然后对当前结点P再进行相同的处理;2)若其左孩子为空,则取栈顶元素并进行出栈操作,访问该栈顶结点,然后将当前的P置为栈顶结点的右孩子; 3)直到P为NULL并且栈为空则遍历结束void inOrder2(BinTree *root) /非递归中序遍历 stack s; BinTree *p=root; while(p!=

5、NULL|!s.empty() while(p!=NULL) s.push(p); p=p-lchild; if(!s.empty() p=s.top(); coutdatarchild; 三.后序遍历 后序遍历按照“左孩子-右孩子-根结点”的顺序进行访问。 1.递归实现void postOrder1(BinTree *root) /递归后序遍历 if(root!=NULL) postOrder1(root-lchild); postOrder1(root-rchild); coutdata ; 2.非递归实现后序遍历的非递归实现是三种遍历方式中最难的一种。因为在后序遍历中,要保证左孩子和右孩

6、子都已被访问并且左孩子在右孩子前访问才能访问根结点,这就为流程的控制带来了难题。下面介绍两种思路。 第一种思路:对于任一结点P,将其入栈,然后沿其左子树一直往下搜索,直到搜索到没有左孩子的结点,此时该结点出现在栈顶,但是此时不能将其出栈并访问,因此其右孩子还为被访问。所以接下来按照相同的规则对其右子树进行相同的处理,当访问完其右孩子时,该结点又出现在栈顶,此时可以将其出栈并访问。这样就保证了正确的访问顺序。可以看出,在这个过程中,每个结点都两次出现在栈顶,只有在第二次出现在栈顶时,才能访问它。因此需要多设置一个变量标识该结点是否是第一次出现在栈顶。void postOrder2(BinTree

7、 *root) /非递归后序遍历 stack s; BinTree *p=root; BTNode *temp; while(p!=NULL|!s.empty() while(p!=NULL) /沿左子树一直往下搜索,直至出现没有左子树的结点 BTNode *btn=(BTNode *)malloc(sizeof(BTNode); btn-btnode=p; btn-isFirst=true; s.push(btn); p=p-lchild; if(!s.empty() temp=s.top(); s.pop(); if(temp-isFirst=true) /表示是第一次出现在栈顶 temp

8、-isFirst=false; s.push(temp); p=temp-btnode-rchild; else /第二次出现在栈顶 coutbtnode-data ; p=NULL; 第二种思路:要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈。如果P不存在左孩子和右孩子,则可以直接访问它;或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。若非上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问。void postOrder3(BinTr

9、ee *root) /非递归后序遍历 stack s; BinTree *cur; /当前结点 BinTree *pre=NULL; /前一次访问的结点 s.push(root); while(!s.empty() cur=s.top(); if(cur-lchild=NULL&cur-rchild=NULL)| (pre!=NULL&(pre=cur-lchild|pre=cur-rchild) coutdatarchild!=NULL) s.push(cur-rchild); if(cur-lchild!=NULL) s.push(cur-lchild); 四.整个程序完整的代码/*二叉树

10、的遍历* 2011.8.25*/ #include #include#include using namespace std;typedef struct node char data; struct node *lchild,*rchild;BinTree;typedef struct node1 BinTree *btnode; bool isFirst;BTNode;void creatBinTree(char *s,BinTree *&root) /创建二叉树,s为形如A(B,C(D,E)形式的字符串 int i; bool isRight=false; stack s1; /存放结点

11、 stack s2; /存放分隔符 BinTree *p,*temp; root-data=s0; root-lchild=NULL; root-rchild=NULL; s1.push(root); i=1; while(idata=si; p-lchild=NULL; p-rchild=NULL; temp=s1.top(); if(isRight=true) temp-rchild=p; coutdata的右孩子是silchild=p; coutdata的左孩子是siendl; if(si+1=() s1.push(p); i+; void display(BinTree *root)

12、/显示树形结构 if(root!=NULL) coutdata; if(root-lchild!=NULL) coutlchild); if(root-rchild!=NULL) coutrchild); cout); void preOrder1(BinTree *root) /递归前序遍历 if(root!=NULL) coutdatalchild); preOrder1(root-rchild); void inOrder1(BinTree *root) /递归中序遍历 if(root!=NULL) inOrder1(root-lchild); coutdatarchild); void

13、 postOrder1(BinTree *root) /递归后序遍历 if(root!=NULL) postOrder1(root-lchild); postOrder1(root-rchild); coutdata ; void preOrder2(BinTree *root) /非递归前序遍历 stack s; BinTree *p=root; while(p!=NULL|!s.empty() while(p!=NULL) coutdatalchild; if(!s.empty() p=s.top(); s.pop(); p=p-rchild; void inOrder2(BinTree

14、*root) /非递归中序遍历 stack s; BinTree *p=root; while(p!=NULL|!s.empty() while(p!=NULL) s.push(p); p=p-lchild; if(!s.empty() p=s.top(); coutdatarchild; void postOrder2(BinTree *root) /非递归后序遍历 stack s; BinTree *p=root; BTNode *temp; while(p!=NULL|!s.empty() while(p!=NULL) /沿左子树一直往下搜索,直至出现没有左子树的结点 BTNode *b

15、tn=(BTNode *)malloc(sizeof(BTNode); btn-btnode=p; btn-isFirst=true; s.push(btn); p=p-lchild; if(!s.empty() temp=s.top(); s.pop(); if(temp-isFirst=true) /表示是第一次出现在栈顶 temp-isFirst=false; s.push(temp); p=temp-btnode-rchild; else /第二次出现在栈顶 coutbtnode-data ; p=NULL; void postOrder3(BinTree *root) /非递归后序遍

16、历 stack s; BinTree *cur; /当前结点 BinTree *pre=NULL; /前一次访问的结点 s.push(root); while(!s.empty() cur=s.top(); if(cur-lchild=NULL&cur-rchild=NULL)| (pre!=NULL&(pre=cur-lchild|pre=cur-rchild) coutdatarchild!=NULL) s.push(cur-rchild); if(cur-lchild!=NULL) s.push(cur-lchild); int main(int argc, char *argv) char s100; while(scanf(%s,s)=1) BinTree *root=(BinTree *)malloc(sizeof(BinTree); creatBinTree(s,root); display(root); coutendl; preOrder2(root); coutendl; inOrder2(root); coutendl; postOrder2(root); coutendl; postOrder3(root); coutendl; return 0;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1