数据结构第6章树和二叉树2遍历二叉树和线索二叉树.pptx
《数据结构第6章树和二叉树2遍历二叉树和线索二叉树.pptx》由会员分享,可在线阅读,更多相关《数据结构第6章树和二叉树2遍历二叉树和线索二叉树.pptx(52页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、武汉科技大学Wuhan University of Science and Technology张 凯计算机学院 软件工程系2011年3月12日树和森林第第6 6章章 树树和和二叉树二叉树树的基本概念二叉树遍历二叉树和线索二叉树赫夫曼树及其应用v提出提出问题问题6.3 遍历遍历二叉树和线索二叉树二叉树和线索二叉树 在二叉树的一些应用中,常要求在树中查找具有某种特征的结点,或者对树中全部结点逐一进行某种处理。这就提出了遍历二叉树的问题。v遍历遍历是是任何类型均有的操作任何类型均有的操作6.3 遍历遍历二叉树和线索二叉树二叉树和线索二叉树 对线性结构而言,只有一条搜索路径(因为每个结点均只有一个后
2、继);而二叉树是非线性结构,每个结点有两个后继,则存在如何遍历,即按什么样的搜索路径遍历的问题。v遍历遍历二叉树二叉树6.3 遍历遍历二叉树和线索二叉树二叉树和线索二叉树 对二叉树而言,是由三个基本单元组成:根结点、左子树和右子树。因此,若能遍历这三部分,便是遍历了整个二叉树。考虑:一共有多少种遍历 二叉树的方案?v遍历遍历二叉树二叉树6.3 遍历遍历二叉树和线索二叉树二叉树和线索二叉树 假如以 L、D、R 分别表示遍历二叉树的左子树、访问根结点、遍历右子树,则有 D L R、L D R、L R D D R L、R D L、R L D 先序 中序 后序 六种遍历方案选择v先先左后右的遍历算法左
3、后右的遍历算法6.3 遍历遍历二叉树和线索二叉树二叉树和线索二叉树 先(根)序遍历算法 DLR 中(根)序遍历算法 LDR 后(根)序遍历算法 LRDv先先(根)序遍历算法(根)序遍历算法6.3 遍历遍历二叉树和线索二叉树二叉树和线索二叉树若二叉树为空树,则空操作;否则(1)访问根结点;(2)先序遍历左子树;(3)先序遍历右子树。void PreOrderTraverse(BiTree bt)if(bt)printf(%c,bt-data);/*输出根结点数据域的值*/PreOrderTraverse(bt-lchild);/*先序遍历左子树*/PreOrderTraverse(bt-rchi
4、ld);/*先序遍历右子树*/v中中(根)序遍历算法(根)序遍历算法6.3 遍历遍历二叉树和线索二叉树二叉树和线索二叉树若二叉树为空树,则空操作;否则(1)中序遍历左子树;(2)访问根结点;(3)中序遍历右子树。void InOrderTraverse(BiTree bt)if(bt)InOrderTraverse(bt-lchild);/*中序遍历左子树*/printf(%c,bt-data);/*输出根结点数据域的值*/InOrderTraverse(bt-rchild);/*中序遍历右子树*/v后后(根)序遍历算法(根)序遍历算法6.3 遍历遍历二叉树和线索二叉树二叉树和线索二叉树若二叉
5、树为空树,则空操作;否则(1)后序遍历左子树;(2)后序遍历右子树;(3)访问根结点。void PostOrderTraverse(BiTree bt)if(bt)PostOrderTraverse(bt-lchild);/*后序遍历左子树*/PostOrderTraverse(bt-rchild);/*后序遍历右子树*/printf(%c,bt-data);/*输出根结点数据域的值*/v例例16.3 遍历遍历二叉树和线索二叉树二叉树和线索二叉树先序遍历的结果是:中序遍历的结果是:后序遍历的结果是:A B CD EA B D E CD B E A CD E B C A口诀:DLR先序遍历,即先
6、根再左再右LDR中序遍历,即先左再根再右LRD后序遍历,即先左再右再根v例例2:用二叉树表示算术表达式:用二叉树表示算术表达式6.3 遍历遍历二叉树和线索二叉树二叉树和线索二叉树+*A*/EDCB先序遍历+*/A B C D E前缀表示中序遍历A/B*C*D+E中缀表示后序遍历A B/C*D*E+后缀表示层序遍历+*E*D/C A Bv例例36.3 遍历遍历二叉树和线索二叉树二叉树和线索二叉树 假设一棵二叉树的先序序列为 E B A D C F H G I K J,中序序列为 A B C D E F G H I J K。画出该二叉树。v遍历算法遍历算法的的递归实现递归实现6.3 遍历遍历二叉树
7、和线索二叉树二叉树和线索二叉树回忆1:二叉树结点的数据类型定义:typedef struct node*tree_pointer;typedef struct node int data;tree_pointer left_child,right_child;node;回忆2:递归求解 n!long int fact(n)/求n!long s;if(n1)s=n*fact(n-1);else f=1;return(f);v先先序遍历二叉树的递归算法序遍历二叉树的递归算法6.3 遍历遍历二叉树和线索二叉树二叉树和线索二叉树Status PreOrderTraverse(BiTree T,Stat
8、us(*Visit)(TElemType e)/二叉链表存储结构,visit是对数据元素操作的应用函数/先序遍历二叉树T的递归算法,对每个数据元素调用visit if(T)if(Visit(T-data)if(PreOrderTraverse(T-lchild,Visit)if(PreOrderTraverser(T-rchild,Visit)return OK;return ERROR;else return OK;PreOrderTraverseACBD主主程程序序Pre(T)Pre(T R);Pre(T R);TAVisit(A);Pre(T L);TDVisit(D);Pre(T L)
9、;TCVisit(C);Pre(T L);TBVisit(B);Pre(T L);返回返回TPre(T R);返回返回T返回返回T返回返回T返回返回TPre(T R);得到的遍历次序为:A B D CPreOrderTraverse(BiTree T,Status(*Visit)(TElemType e)if(T)if(Visit(T-data)if(PreOrderTraverse(T-lchild,Visit)if(PreOrderTraverser(T-rchild,Visit)return OK;return ERROR;else return OK;v中中序遍历二叉树的递归算法序遍历
10、二叉树的递归算法6.3 遍历遍历二叉树和线索二叉树二叉树和线索二叉树Status InOrderTraverse(BiTree T,Status(*Visit)(TElemType e)if(T)if(InOrderTraverse(T-lchild,Visit)if(Visit(T-data)if(InOrderTraverse(T-rchild,Visit)return OK;return ERROR;else return OK;/InOrderTraversev后序后序遍历二叉树的递归算法遍历二叉树的递归算法6.3 遍历遍历二叉树和线索二叉树二叉树和线索二叉树Status PostOr
11、derTraverse(BiTree T,Status(*Visit)(TElemType e)if(T)if(PostOrderTraverse(T-lchild,Visit)if(PostOrderTraverse(T-rchild,Visit)if(Visit(T-data)return OK;return ERROR;else return OK;/PostOrderTraversev遍遍历的分析的分析6.3 遍历遍历二叉树和线索二叉树二叉树和线索二叉树1.从前面的三种遍历算法可以知道:如果将print语句抹去,从递归的角度看,这三种算法是完全相同的,或者说这三种遍历算法的访问路径是相
12、同的,只是访问结点的时机不同。从虚线的起点到终点,每个结点经过3次AFEDCBG第1次经过时访问先序遍历第2次经过时访问中序遍历第3次经过时访问后序遍历2.二叉树遍历的时间效率和空间效率时间效率:O O(n n)/每个结点只访问一次空间效率:O O(n n)/栈占用的最大辅助空间v中中序遍序遍历二叉二叉树的非的非递归算法一算法一6.3 遍历遍历二叉树和线索二叉树二叉树和线索二叉树Staus InOrderTrav(BiTree T,Status(*Visit)(TElemType e)/中序遍历二叉树T的非递归算法,对每个数据元素调用函数visit.InitStack(S);Push(S,T)
13、;/根指针进栈while(!StackEmpty(S)while(GetTop(S,p)&p)Push(S,p-lchild);/向左走到尽头 Pop(S,p);/空指针退栈 if(!StackEmpty(S)/访问结点,向右一步 Pop(S,p);if(!Visit(p-data)return error;Push(S,p-rchild);/if/whileReturn ok;/InOrderTraverseACBEDv中中序遍序遍历二叉二叉树的非的非递归算法二算法二6.3 遍历遍历二叉树和线索二叉树二叉树和线索二叉树Status InOrderTrv(BiTree T,Status(*Vi
14、sit)(TElemType e)/采用二叉链表存储结构,Visit是对数据元素操作的应用函数/中序遍历二叉树T的非递归算法,对每个数据元素调用函数Visit。InitStack(S);p=T;while(p|!StackEmpty(S)if(p)Push(&S,p);p=p-lchild;else Pop(&S,&p);if(!Visit(p-data)return ERROR;p=p-rchild;/else /while return OK;/InOrderTrv/根指针进栈,遍历左子树/根指针退栈,访问根结点,遍历右子树 ACBEDv遍遍历算法的算法的应用用举例例6.3 遍历遍历二叉树
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 二叉 遍历 线索
限制150内