第六章树和二叉树PPT讲稿.ppt
《第六章树和二叉树PPT讲稿.ppt》由会员分享,可在线阅读,更多相关《第六章树和二叉树PPT讲稿.ppt(75页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第六章 树和二叉树1第1页,共75页,编辑于2022年,星期三 第六章第六章 树和二叉树树和二叉树6.1 树的有关概念6.2 二叉树6.3二叉树的遍历6.4 遍历的应用6.5 线索二叉树6.6 树和森林6.7 哈夫曼树及应用2第2页,共75页,编辑于2022年,星期三 6.1 6.1 树的有关概念树的有关概念1.树的概念2.树的应用3.树的表示4.树的有关术语5树的基本操作3第3页,共75页,编辑于2022年,星期三1树的概念树的概念 树是树是n个结点的有限集合,在任一棵非空树中:个结点的有限集合,在任一棵非空树中:(1)有且仅有一个称为根的结点。)有且仅有一个称为根的结点。(2)其余结点可分
2、为个互不相交的集合,而且这些集合中的每一集)其余结点可分为个互不相交的集合,而且这些集合中的每一集合都本身又是一棵树,称为根的子树。合都本身又是一棵树,称为根的子树。树是递归结构,在树的定义中又用到了树的概念J JI IA AC CB BD DH HG GF FE E4第4页,共75页,编辑于2022年,星期三从逻辑结构看:从逻辑结构看:1)树中只有根结点没有前趋;)树中只有根结点没有前趋;2)除根外,其余结点都有且仅一个前趋;)除根外,其余结点都有且仅一个前趋;3)树的结点,可以有零个或多个后继;)树的结点,可以有零个或多个后继;4)除根外的其他结点,都存在唯一条从根到该结点的路径;)除根外
3、的其他结点,都存在唯一条从根到该结点的路径;5)树是一种分枝结构)树是一种分枝结构 (除了一个称为根的结点外)每个元素都有且仅(除了一个称为根的结点外)每个元素都有且仅有一个直接前趋,有且仅有零个或多个直接后继。有一个直接前趋,有且仅有零个或多个直接后继。J JI IA AC CB BD DH HG GF FE E1树的概念树的概念 5第5页,共75页,编辑于2022年,星期三4树的基本术语树的结点:包含一个数据元素及若干指向子树的分支;孩子结点:结点的子树的根称为该结点的孩子;双亲结点:B结点是A结点的孩子,则A结点是B结点的双亲;兄弟结点:同一双亲的孩子结点;堂兄结点:同一层上结点;结点层
4、:根结点的层定义为1;根的孩子为第二层结点,依此类推;树的高度:树中最大的结点层结点的度:结点子树的个数树的度:树中最大的结点度。叶子结点:也叫终端结点,是度为0的结点;分枝结点:度不为0的结点;森林;互不相交的树集合;有序树:子树有序的树,如:家族树;无序树:不考虑子树的顺序;6第6页,共75页,编辑于2022年,星期三5树的基本操作树的应用很广,应用不同基本操作也不同。下面列举了树的一些基本操作:(以DOS元文件系统为例解释树的基本操作)1)InitTree(&T);2)DestroyTree(&T);3)CreateTree(&T,definition);4)ClearTree(&T);
5、5)TreeEmpty(T);6)TreeDepth(T);7)Root(T);8)Value(T,&cur_e);9)Assign(T,cur_e,value);10)Paret(T,cur_e);11)LeftChild(T,cur_e);12)RightSibling(T,cur_e);13)InsertChild(&T,&p,i,c);14)DeleteChild(&T,&p,i);15)TraverseTree(T,Visit();7第7页,共75页,编辑于2022年,星期三 6.2 6.2 二叉树二叉树一 二叉树的概念二 二叉树的性质三 二叉树的存储结构8第8页,共75页,编辑于2
6、022年,星期三一一 二叉树的概念二叉树的概念1 1 二叉树的定义二叉树的定义二叉树:或为空树,或由根及两颗不相交的左子树、右子树构成,并且左、右子树本身也是二叉树。说明说明1)二叉树中每个结点最多有两颗子树;二叉树每个结点度小于等于2;2)左、右子树不能颠例有序树;3)二叉树是递归结构,在二叉树的定义中又用到了二叉树的概念;A A F F G G E E D D C C B B9第9页,共75页,编辑于2022年,星期三 A A F F G G E E D D C C B B(a)、(b)是不同的二叉树,(a)的左子树有四个结点,(b)的左子树有两个结点,(a)A A G G E E D D
7、 B B C C F F(b)10第10页,共75页,编辑于2022年,星期三2 二叉树的基本形态二叉树的基本形态11第11页,共75页,编辑于2022年,星期三3应用举例例1 可以用二叉树表示表达式 e e d d c c b b f f a a +*/-a b c d-*+e f/-a b c d-*+e f/-表达式的后缀表示表达式的后缀表示 a+b*c a+b*c d d e/f -e/f -表达式的中缀表示表达式的中缀表示 -+a*b-+a*b c d/e f -c d/e f -表达式的前缀表示表达式的前缀表示 12第12页,共75页,编辑于2022年,星期三3应用举例例1 可以用
8、二叉树表示表达式 e e d d c c b b f f a a +*/-a b c d-*+e f/-a b c d-*+e f/-表达式的后缀表示表达式的后缀表示 a+b*c a+b*c d d e/f -e/f -表达式的中缀表示表达式的中缀表示 -+a*b-+a*b c d/e f -c d/e f -表达式的前缀表示表达式的前缀表示 13第13页,共75页,编辑于2022年,星期三下面是两个关于二叉树的性质性质1:在二叉树的第i层上至多有2i-1个结点(i=1)利用归纳法证明性质2:深度为k的二叉树至多有2k-1个结点(k=1)第比数列求和性质3:对任何一棵二叉树T,如果其终端结点数
9、为n0,度为2的结点 数为n2,则n0=n2+114第14页,共75页,编辑于2022年,星期三两种特殊的二叉树满二叉树:如果深度为k的二叉树,有2k-1个结点则称为满二叉树;A A G G F F E E D D C C B B A A C C B BK=3的满二叉树K=2的满二叉树15第15页,共75页,编辑于2022年,星期三完全二叉树:如果一颗二叉树只有最下一层结点数可能未达到最大,并且最下层结点都集中在该层的最左端,则称为完全二叉树;A A E E D D C C B B G G A A E E D D C C B B(a)a)(c)c)(b)b)(a)(a)、(b)b)完全二叉树(
10、c)c)不是完全二叉树 A A G G F F E E D D C C B B16第16页,共75页,编辑于2022年,星期三下面是两个关于完全二叉树的性质性质4 具有n个结点的完全二叉树的深度为:log2 n+1对完全二叉树的结点编号:从上到下,每一层从左到右 A A F F E E D D C C B B1 12 23 34 45 56 6性质5:在完全二叉树中编号为i的结点,1)若有左孩子,则左孩编号为2i;2)若有右孩子,则有孩子结点编号为2i+1;3)若有双亲,则双亲结点编号为i/2;17第17页,共75页,编辑于2022年,星期三三二叉树存贮结构三二叉树存贮结构 1 二叉树的顺序结
11、构完全二叉树的顺序结构用一组连续的内存单元,按编号顺序依次存储完全二叉树的元素顺序结构图示1 2 3 4 5 6 7 1 2 3 4 5 6 7 m-1m-1 A B C D E FA B C D E F A A F F E E D D C C B B1 12 23 34 45 56 618第18页,共75页,编辑于2022年,星期三二叉树的顺序结构 假想,我们补齐二叉树所缺少的那些结点,对二叉树结点编号 A A F F G G E E D D C C B B7 71 16 62 24 45 53 3 A A F F G G E E D D C C B B9 98 8101019第19页,共7
12、5页,编辑于2022年,星期三1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 m-m-1 1 A B A B C C D E D E F F G G二叉树的顺序结构图示将二叉树原有的结点按编号存储到内存单元“相应”的位置上1 16 62 24 45 53 3 A A F F G G E E D D C C B B9 98 8101020第20页,共75页,编辑于2022年,星期三2 二叉链表 二叉链表中每个结点包含三个域:数据域、左指针域、右指针域 D D A A B B C C E E F F A A F F E E D D C C B B3 三叉链表 三叉链表中每个
13、结点包含四个域:数据域、双亲指针域、左指针域、右指针域二叉链表图示21第21页,共75页,编辑于2022年,星期三4 静态链表 上面二叉链表或三叉链表是用指针实现,是一种动态的链式存储结构,链式存储结构也可用一维数组来实现,用一维数组表示的二叉链表或三叉链表,称为静态链表 A A F F E E D D C C B B孩子结点在数组中的位置-1表示无左或右孩子静态二叉链表2 A 13 C -15 B -1-1 E-1-1 F-1-1 D 4 0123456Lchild data rchild22第22页,共75页,编辑于2022年,星期三 6.3 6.3 二叉树的遍历二叉树的遍历 一.二叉树的
14、遍历方法 二.遍历的递归算法23第23页,共75页,编辑于2022年,星期三遍历:按某种搜索路径访问二叉树的每个结点,而且每个结点仅被访问一次。访问:含义很广,可以是对结点的各种处理,如修改结点数据、输出结点数据。遍历是各种数据结构最基本的操作,许多其他的操作可以在遍历基础上实现。如何访问二叉树的每个结点,而且每个结点仅被访问一次?24第24页,共75页,编辑于2022年,星期三一一二叉树的遍历方法二叉树的遍历方法 二叉树由根、左子树、右子树三部分组成 二叉树的遍历可以分解为:访问根,遍历左子树和遍历右子树令:令:L L:遍历左子树 D D:访问根结点 R R:遍历右子树 有六种遍历方法:D
15、DL LR R,L LD DR R,L LR RD D,D DR RL L,R RD DL L,R RL LD D 约定先左后右,有三种遍历方法:D DL LR R、L LD DR R、L LR RD D,分别称为 先序遍历、中序遍历、后序遍历 A A F F G G E E D D C C B B25第25页,共75页,编辑于2022年,星期三 先序遍历(DLR)若二叉树非空(1)访问根结点;(2)先序遍历左子树;(3)先序遍历右子树;先序遍历序列:A,A,B,D,E,G,B,D,E,G,C,FC,F A A F F G G E E D D C C B B例:先序遍历右图所示的二叉树 (1)
16、访问根结点A (2)先序遍历左子树:即按D DL LR R的顺序遍历左子树 (3)先序遍历右子树:即按D DL LR R的顺序遍历右子树26第26页,共75页,编辑于2022年,星期三中序遍历(L LD DR R)若二叉树非空(1)中序遍历左子树(2)访问根结点(3)中序遍历右子树 中序遍历序列:D,B,G,E,D,B,G,E,A,A,C,FC,F A A F F G G E E D D C C B B例:中序遍历右图所示的二叉树 (1)中序遍历左子树:即按L LD DR R的顺序遍历左子树 (2)访问根结点A A (3)中序遍历右子树:即按L LD DR R的顺序遍历右子树27第27页,共7
17、5页,编辑于2022年,星期三后序遍历(L LR RD D)若二叉树非空(1)后序遍历左子树(2)后序遍历右子树(3)访问根结点 后序遍历序列:D,G,E,B,D,G,E,B,F,C,F,C,A A例:后序遍历右图所示的二叉树 (1)后序遍历左子树:即按L LR RD D的顺序遍历左子树 (2)后序遍历右子树:即按L LR RD D的顺序遍历右子树 (3)访问根结点A A A A F F G G E E D D C C B B28第28页,共75页,编辑于2022年,星期三 e e d d c c b b f f a a +*/-后序遍历序列:a b c d-*+a b c d-*+e f/e
18、 f/-中序遍历序列:a+b*c a+b*c d d e/fe/f 先序遍历序列:-+a*b+a*b c d c d/e f/e f例:先序遍历、中序遍历、后序遍历下图所示的二叉树29第29页,共75页,编辑于2022年,星期三按层遍历:从根出发,依次访问第一层、第二层结点 A A F F G G E E D D C C B B按层遍历序列:A B C D E F G30第30页,共75页,编辑于2022年,星期三 若二叉树非空 (1)访问根结点;(2)先序遍历左子树 (3)先序遍历右子树;二二.遍历的递归算法遍历的递归算法先序遍历(DLR)的定义:上面先序遍历的定义等价于:若二叉树为空,结束
19、 基本项(也叫终止项)若二叉树非空 递归项 (1)访问根结点;(2)先序遍历左子树 (3)先序遍历右子树;31第31页,共75页,编辑于2022年,星期三1先序遍历递归算法先序遍历递归算法void PreOrderTraverse(BiTree T,Status(*Visit)(TElemType e)/采用二叉链表存贮二叉树,visit()是访问结点的函数。/本算法先序遍历以T为根结点指针的二叉树if(T)/若二叉树不为空,Visit(T-data);/访问根结点 PreOrderTraverse(T-lchild,Visit);/先序遍历T的左子树,PreOrderTraverse(T-r
20、child,Visit);/先序遍历T的右子树/PreOrderTraverse最简单的Visit函数是:StatusPrintElement(TElemTypee)/输出元素e的值printf(e);returnOK;D D A A B B C C E E F F T T32第32页,共75页,编辑于2022年,星期三2 中序遍历递归算法中序遍历递归算法void InOrderTraverse(BiTree T,Status(*Visit)(TElemType e)/采用二叉链表存贮二叉树,visit()是访问结点的函数。/本算法中序中序遍历以T,为根结点指针的二叉树 if(T)/若二叉树不
21、为空,访问根结点,遍历右子树InOrderTraverse(T-lchild,Visit);/中序中序遍历T的左子树Visit(T-data);/访问根结点InOrderTraverse(T-rchild,Visit);/中序中序遍历T的右子树/InOrderTraverse 33第33页,共75页,编辑于2022年,星期三3 后序遍历递归算法后序遍历递归算法voidPostOrderTraverse(BiTreeT,Status(*Visit)(TElemTypee)/采用二叉链表存贮二叉树,visit()是访问结点的函数。/本算法后序遍历以T为根结点指针的二叉树,对每个数据元素调用函数Vi
22、sit()if(T)/若二叉树不为空,PostOrderTraverse(T-lchild,Visit);/后序遍历T的左子树PostOrderTraverse(T-rchild,Visit);/后序遍历T的右子树,Visit(T-data);/访问根结点/PostOrderTraverse34第34页,共75页,编辑于2022年,星期三遍历的非递归算法遍历的非递归算法中序遍历的非递归算法中序遍历的非递归算法(使用栈实现非递归中序遍历使用栈实现非递归中序遍历)StatusInOrderTraverse(BiTreeT,Status(*Visit)(TelemTypee)/采用二叉链表存储结构,
23、Visit是对数据元素操作的应用函数。/中序遍历二叉树T的非递归算法,对每个数据元素调用函数Visit。InitStack(S);p=T;While(p|!StackEmpty(s)if(p)Push(s,p);p=p-lchild;/根指针进栈,遍历右子树else/根指针退栈,访问根结点,遍历右子树Pop(S,p);Visit(p-data);p=p-rchild;/else/WhilereturnOK;/InOrderTraverse35第35页,共75页,编辑于2022年,星期三按层遍历算法 与图的广度优先遍历类似,利用队列实现树的按层遍历StatusLevelTraverse(BiTr
24、eeT,Status(*Visit)(TelemTypee)/采用二叉链表存储结构,Visit是对数据元素操作的应用函数。使用辅助队列Q,按层遍历二叉树T。InitQueue(Q);InitQueue(Q);/建空的辅助队列Q p=T;p=T;Visit(p-data)Visit(p-data),EnQueue(Q,p)/EnQueue(Q,p)/访问访问p p所指结点所指结点,p,p入队入队 While(!QueueEmpty(Q)While(!QueueEmpty(Q)DeQueue(Q,p);DeQueue(Q,p);/队头元素出队,并赋值给p p=p p=p-lchild,Visit(
25、p-data);EnQueue(Q,p);,Visit(p-data);EnQueue(Q,p);p=p p=p-rchild,Visit(p-data);EnQueue(Q,p);,Visit(p-data);EnQueue(Q,p);/while /while/LevelTraverse36第36页,共75页,编辑于2022年,星期三 6.4 6.4 遍历的应用遍历的应用 1.求二叉树的叶子结点个数 2.建立二叉链表 37第37页,共75页,编辑于2022年,星期三例1编写求二叉树的叶子结点个数的算法输入:二叉树的二叉链表结果:二叉树的叶子结点个数 D D A A B B C C E E
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第六章 树和二叉树PPT讲稿 第六 二叉 PPT 讲稿
限制150内