160 likes | 347 Views
æ•°æ®ç»“构讲义. 第 6 ç« æ ‘å’ŒäºŒå‰æ ‘. — é历二å‰æ ‘. 嘉应å¦é™¢ æ•°å¦ç³». D. L. R. LDR 〠LRD 〠DLR RDL 〠RLD 〠DRL. 6.3 é历二å‰æ ‘. 二å‰æ ‘çš„é历 方法 å…ˆåºéåŽ†ï¼šå…ˆè®¿é—®æ ¹ç»“ç‚¹ , 然åŽåˆ†åˆ«å…ˆåºé历左åæ ‘ã€å³åæ ‘ã€‚ ä¸åºé历:先ä¸åºé历左åæ ‘ï¼Œç„¶åŽè®¿é—®æ ¹ç»“点,最åŽä¸åºé历å³åæ ‘ã€‚ åŽåºé历:先åŽåºé历左ã€å³åæ ‘ï¼Œç„¶åŽè®¿é—®æ ¹ç»“点。 按层次é历:从上到下ã€ä»Žå·¦åˆ°å³è®¿é—®å„结点。. A. C. B. D. A. D L R. D L R. >. >. >. B. C.
E N D
数据结构讲义 第6章 树和二叉树 — 遍历二叉树 嘉应学院 数学系
D L R LDR、LRD、DLR RDL、RLD、DRL 6.3 遍历二叉树 • 二叉树的遍历 • 方法 • 先序遍历:先访问根结点,然后分别先序遍历左子树、右子树。 • 中序遍历:先中序遍历左子树,然后访问根结点,最后中序遍历右子树。 • 后序遍历:先后序遍历左、右子树,然后访问根结点。 • 按层次遍历:从上到下、从左到右访问各结点。
A C B D A D L R D L R > > > B C D L R > > D 先序遍历: D L R 先序遍历序列:A B D C
A C B D B L D R L D R > > > A C L D R > > D 中序遍历: L D R 中序遍历序列:B D A C
A C B D L R D L R D B L R D > > > A C > > D 后序遍历: L R D 后序遍历序列: D B C A
- + / a * f e b - c d 先序遍历: + a * b - c d / e f - 中序遍历: a + b * c - d - e / f 后序遍历: a b c d - * + e f / - 层次遍历: - + / a * e f b - c d
A B C 左是空返回 左是空返回 > 右是空返回 T D T 左是空返回 B T D 右是空返回 T printf(B); > A T printf(D); 主程序 pre(T L); printf(A); pre(T L); pre(T R); pre(T L); > pre(T R); T Pre( T ) pre(T R); T C > T printf(C); pre(T L); > pre(T R); T A void preorder(JD *bt) { if(bt!=NULL) { printf("%d\t",bt->data); preorder(bt->lchild); preorder(bt->rchild); } } B C D 返回 返回 返回 返回 先序序列:A B D C 返回
p p p i i P->A P->B P->A (2) A A A A (1) B B B B C C C C D D D D i E E E E F F F F i P->C p=NULL G G G G P->B P->B P->A P->A (3) 访问:C (4) • 非递归算法实现中序遍历
p p i i P->D P->A P->A (5) 访问:C B (6) 访问:C B A A A A B B B B C C C C D D D D i i E E E E F F F F P->E P->D P->D G G G G P->A P->A p p 访问:C B E 访问:C B (8) (7)
p p i P->G i P->D P->D P->A P->A 访问:C B E (9) (10) 访问:C B E G P=NULL A A A A p B B B B C C C C D D D D i E E E E F F F F P->F i G G G G P->A P->A 访问:C B E G D 访问:C B E G D (12) (11)
p i i P->A p=NULL (13) 访问:C B E G D F A (14) 访问:C B E G D F A A A p=NULL B B B C C C D D D E E E F F F G G G i (15) 访问:C B E G D F A 后序遍历非递归算法
A A ^ B ^ C ^ D ^ E ^ F ^ ^ G ^ B C D E F G • 遍历算法应用 • 按先序遍历序列建立二叉树的二叉链表,已知先序序列为: A B C D E G F 二叉树的建立演示
用队列实现层次遍历 • 可使用一个顺序存储的队列q[100],存放还没有处理的子树的根结点的地址。注意,队首和队尾指针分别指向队首结点和下次进队结点的存放位置。 • 首先把根节点入队。 • 然后访问队头的一个结点,再把该结点非空的左右子树入队。 • 如果队列不空,重复2)。
A B C D E F G 作业 • 当用栈非递归实现树的先序遍历时,写出遍历右边所表示的树的全过程。像讲义中那样,写出遍历每一步栈中的数据。不是写具体的实现代码。
实验报告 • 按先序遍历序列建立二叉树的二叉链表,已知先序序列为(表示空格):ABCDEGF。并写一个函数treenodes()统计该二叉树的节点个数。如果有可能,写一个输出函数treeprint()用树形结构打印出该二叉树。 • 注意实验报告中不必写完整代码。写树结构定义,已有函数声明, treenodes()和treeprint()的代码,实现过程,心得体会。