二叉树的遍历 课件.ppt

  1. 1、本文档共38页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
二叉树的遍历 课件

其中,TRL、RTL和RLT三种顺序在左右子树之间均是先右子树后左子树,这与人们先左后右的习惯不同,因此,往往不予采用。余下的三种顺序TLR、LTR和LRT根据根访问的位置不同分别被称为前序遍历、中序遍历和后序遍历。 (1)二叉树的前序遍历 首先访问根结点; 然后按照前序遍历的顺序访问根结点的左子树; 再按照前序遍历的顺序访问根结点的右子树。 下面我们再给出一种遍历二叉树的方法 (1)对一棵二叉树中序遍历时,若我们将二叉树严格地按左子树的所有结点位于根结点的左侧,右子树的所有结点位于根右侧的形式绘制,就可以对每个结点做一条垂线,映射到下面的水平线上,由此得到的顺序就是该二叉树的中序遍历序列。 遍历二叉树递归算法 2 、中序遍历二叉树的递归算法 void inorder(bintree t) { if (t) { inorder(t-lchild); printf(“%c”,t-data); inorder(t-rchild); } } 3 、后序遍历二叉树的递归算法 void postorder(bintree t) { if (t) { postorder(t-lchild); postorder(t-rchild); printf(%c,t-data); } } 4 、二叉树的创建算法 利用二叉树前序遍历的结果可以非常方便地生成给定的二叉树,具体做法是:将第一个输入的结点作为二叉树的根结点,后继输入的结点序列是二叉树左子树前序遍历的结果,由它们生成二叉树的左子树;再接下来输入的结点序列为二叉树右子树前序遍历的结果,应该由它们生成二叉树的右子树;而由二叉树左子树前序遍历的结果生成二叉树的左子树和由二叉树右子树前序遍历的结果生成二叉树的右子树的过程均与由整棵二叉树的前序遍历结果生成该二叉树的过程完全相同,只是所处理的对象范围不同,于是完全可以使用递归方式加以实现。 void createbintree(bintree *t) { char ch; if ((ch=getchar())== ) *t=NULL; else { *t=(bintnode *)malloc(sizeof(bintnode)); /*生成二叉树的根结点*/ (*t)-data=ch; createbintree((*t)-lchild); /*递归实现左子树的建立*/ createbintree((*t)-rchild); /*递归实现右子树的建立*/ } } 7.4.3 二叉树遍历的非递归实现 第5章介绍了由递归程序转换成非递归程序的两种方法:简单递归程序的转换和复杂递归程序的转换; 二叉树的遍历问题应该属于后者,即在采用非递归方式实现二叉树遍历时,必须使用一个堆栈记录回溯点,以便将来进行回溯。以下为一个顺序栈的定义及其部分操作的实现。 typedef struct stack /*栈结构定义*/ { bintree data[100]; int tag[100];//为栈中每个元素设置的标记,用于后序遍历 int top; //栈顶指针,指向栈顶元素,这和2章中top有区别 } seqstack; void push(seqstack *s,bintree t) /*进栈*/ { s-data[++s-top]=t; } bintree pop(seqstack *s) /*出栈*/ { if (s-top!=-1) { s-top--; return(s-data[s-top+1]); } else return NULL; } 1、 二叉树前序遍历的非递归实现 前序遍历一棵非空二叉树t 时,访问完t的根结点后,就应该进入t的左子树

文档评论(0)

pangzilva + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档