文档详情

二叉树的遍历 课件.ppt

发布:2017-12-17约1.1万字共38页下载文档
文本预览下载声明
其中,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的左子树
显示全部
相似文档