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