数据结构--第六章树和二叉树课件.ppt
《数据结构--第六章树和二叉树课件.ppt》由会员分享,可在线阅读,更多相关《数据结构--第六章树和二叉树课件.ppt(114页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、6.1 树的定义与基本概念树的定义与基本概念6.2 二叉树的类型定义二叉树的类型定义6.3 二叉树的存储结构二叉树的存储结构6.4 二叉树的遍历二叉树的遍历6.5 树、森林和二叉树的关系及转换树、森林和二叉树的关系及转换6.6 哈夫曼树与哈夫曼编码哈夫曼树与哈夫曼编码26.1 树的定义与基本概念树的定义与基本概念一、树的基本概念一、树的基本概念二、树的抽象数据类型定义:二、树的抽象数据类型定义:三、树的基本术语三、树的基本术语3一、一、树的基本概念树的基本概念树:树:是是n(n0)个结点的有限集合个结点的有限集合T。当。当n=0时称时称 为空树;当为空树;当n0时,该集合满足如下条件时,该集合
2、满足如下条件:(1)其中必有一个称为其中必有一个称为根根(root)的特定结点,它没的特定结点,它没 有直接前驱,但有零个或多个直接后继。有直接前驱,但有零个或多个直接后继。(2)其余其余n-1个结点可以划分成个结点可以划分成m(m0)个互不相个互不相 交的有限集交的有限集T1,T2,T3,Tm,其中,其中Ti又又 是一棵树,称为是一棵树,称为根根root的的子树子树。每棵子树的。每棵子树的 根结点有且仅有一个直接前驱,但有零个或根结点有且仅有一个直接前驱,但有零个或 多个直接后继。多个直接后继。4数据对象数据对象D D:一个集合,该集合中的所有元素:一个集合,该集合中的所有元素具有相同的特性
3、。具有相同的特性。数据关系数据关系R R:若若D D为空集,则为空树。若为空集,则为空树。若D D中仅中仅含有一个数据元素,则含有一个数据元素,则R R为空集,否则为空集,否则R=HR=H,H H是如下的二元关系:是如下的二元关系:(1)(1)在在D D中存在唯一的称为根的数据元素中存在唯一的称为根的数据元素rootroot,它在关系,它在关系H H下下没有前驱没有前驱。(2)(2)除除rootroot以外,以外,D D中每个结点在关系中每个结点在关系H H下都有下都有且且仅有一个前驱仅有一个前驱。二、树的抽象数据类型定义二、树的抽象数据类型定义6基本操作:(1)InitTree(Tree):
4、):将将Tree初始化为一棵空树。初始化为一棵空树。(2)DestoryTree(Tree):):销毁树销毁树Tree。(3)CreateTree(Tree):):创建树创建树Tree。(4)TreeEmpty(Tree):):若若Tree为空,则返回为空,则返回TRUE,否则返回,否则返回FALSE。(5)Root(Tree):):返回树返回树Tree的根。的根。(6)Parent(Tree,x):):树树Tree存在,存在,x是是Tree中的中的某个结点。若某个结点。若x为非根结点,则返回它的双亲,为非根结点,则返回它的双亲,否则返回否则返回“空空”。7(7)FirstChild(Tree
5、,x):):树树Tree存在,存在,x是是Tree中的某个结点。若中的某个结点。若x为非叶子结点,则返为非叶子结点,则返回它的第一个孩子结点,否则返回回它的第一个孩子结点,否则返回“空空”。(8)NextSibling(Tree,x):):树树Tree存在,存在,x是是Tree中的某个结点。若中的某个结点。若x不是其双亲的最后不是其双亲的最后一个孩子结点,则返回一个孩子结点,则返回x后面的下一个兄弟结后面的下一个兄弟结点,否则返回点,否则返回“空空”。(9)InsertChild(Tree,p,Child):):树树Tree存在,存在,p指向指向Tree中某个结点,非空树中某个结点,非空树Ch
6、ild与与Tree不相交。将不相交。将Child插入插入Tree中,做中,做p所指向所指向结点的子树。结点的子树。8结点结点:结点的度结点的度:树的度树的度:叶子结点叶子结点:分支结点分支结点:数据元素+若干指向子树的分支分支的个数树中所有结点的度的最大值度为零的结点度大于零的结点三、树的基本术语三、树的基本术语10DHIJM孩子孩子结点、双亲双亲结点、兄弟兄弟结点、堂兄弟堂兄弟结点、祖先祖先结点、子孙子孙结点结点的层次结点的层次:树的深度:树的深度:ABCDEFGHIJMKL从根结点开始定义,根结点的层次为1,根的直接后继的层次为2,依此类推。树中叶子结点所在的最大层次11线性结构线性结构树
7、型结构树型结构第一个数据元素第一个数据元素 (无前驱无前驱)根结点根结点 (无前驱无前驱)最后一个数据元素最后一个数据元素 (无后继无后继)多个叶子结点多个叶子结点 (无后继无后继)其它数据元素其它数据元素(一个前驱、一个前驱、一个后继一个后继)其它数据元素其它数据元素(一个前驱、一个前驱、多个后继多个后继)对比对比树型结构树型结构和和线性结构线性结构的结构的结构特点特点13 二叉树或为空树空树;或是由一个根结根结点点加上两棵两棵分别称为左子树左子树和右子树右子树的、互不交的互不交的二叉树二叉树组成。ABCDEFGHK根结点左子树右子树EF二叉树中不存在度大于2的结点,并且二叉树的子树有左子树
8、和右子树之分!15二、二叉树的基本操作二、二叉树的基本操作:(1)Initiate(bt):将):将bt初始化为空二叉树。初始化为空二叉树。(2)Create(bt):):创建一棵非空二叉树创建一棵非空二叉树bt。(3)Destory(bt):):销毁二叉树销毁二叉树bt。(4)Empty(bt):):若若bt为空,则返回为空,则返回TRUE,否则返回否则返回FALSE。(5)Root(bt):求二叉树求二叉树bt的根结点。若的根结点。若bt为空为空二叉树,则函数返回二叉树,则函数返回“空空”。(6)Parent(bt,x):):求双亲函数。求二叉树求双亲函数。求二叉树bt中结点中结点x的双亲
9、结点。若结点的双亲结点。若结点x是二叉树的根是二叉树的根结点或二叉树结点或二叉树bt中无结点中无结点x,则返回,则返回“空空”。16三、二叉树的性质三、二叉树的性质18 性质性质 1:在二叉树的第 i 层上至多有2i-1 个结点。(i1)用归纳法用归纳法证明证明:归纳基归纳基:归纳假设:归纳假设:归纳证明:归纳证明:i=1 层时,只有一个根结点,2i-1=20=1;假设对所有的 j,1 j i,命题成立;二叉树上每个结点至多有两棵子树,则第 i 层的结点数=2i-2 2=2i-1。19性质性质 2:深度为 k 的二叉树上至多含 2k-1 个结点(k1)证明:证明:基于性质1,深度为 k 的二叉
10、树上的结点数至多为 20+21+2k-1=2k-1 20 性质性质 3:对任何一棵二叉树,若它含有n0 个叶子结点、n2 个度为 2 的结点,则必存在关系式:n0=n2+1证明:证明:设设 二叉树上结点总数 n=n0+n1+n2又又 二叉树上分支总数 b=n1+2n2而 b=n-1=n0+n1+n2-1由此,由此,n0=n2+121123456789 1011 12 131415满二叉树满二叉树两类特殊的二叉树两类特殊的二叉树满二叉树:满二叉树:深度为深度为 k 且含有且含有2k-1个结点的二叉树。个结点的二叉树。结点编号:结点编号:一般从根开始按层自上而下一般从根开始按层自上而下,每层从每层
11、从左至右对结点连续编号。左至右对结点连续编号。22 性质性质 4:具有 n 个结点的完全二叉树的深度深度为 log2n +1证明:证明:设设 完全二叉树的深度为 k 则根据第二条性质得 2k-1-1n 2k-1,即2k-1 n 2k 即 k-1 log2 n n,则该结点无左孩子,否则,编号为 2i 的结点为其左孩子左孩子结点;(3)若 2i+1n,则该结点无右孩子结点,否则,编号为2i+1 的结点为其右孩子右孩子结点。用归纳法证明其中的用归纳法证明其中的(2)(2)和和(3)(3),再导出,再导出(1)(1)。256.3 二叉树的存储结构二叉树的存储结构二、链式存储表示二、链式存储表示一、一
12、、顺序存储表示顺序存储表示 二二叉叉树树的的结结构构是是非非线线性性的的,每每一一个个结点最多可有两个后继。结点最多可有两个后继。26A B C D E F G HIJ K L 1 2 3 4 5 6 7 8 9 10 11 12完全二叉树J123456789101112EFHIKLABDCG28一般二叉树12345711ABCEGFDA B C D EFG 1 2 3 4 5 6 7 8 9 10 11编号规则:根结点的编号为1;对于编号为i的结点,左孩子如果存在,则编号为2i,右孩子如果存在则编号为2i+1。29二、链式存储结构 对于任意的二叉树来说,每个结点最多只有对于任意的二叉树来说,
13、每个结点最多只有两个孩子,我们可以设计每个二叉树结点包括两个孩子,我们可以设计每个二叉树结点包括三个域:三个域:数据域、左孩子域和右孩子域数据域、左孩子域和右孩子域。1.1.二叉链表二叉链表2三叉链表三叉链表 有时,为了找到父结点,可以在二叉链表有时,为了找到父结点,可以在二叉链表中增加一个中增加一个ParentParent域域,ParentParent域指向该结点的域指向该结点的父结点。父结点。LChildDataRChildRChildParentDataLChild31DABCEFGA BCD E F G 二叉树二叉树T T二叉链表二叉链表 一个二叉树若含有一个二叉树若含有n n个结点,
14、则它的二个结点,则它的二叉链表中含有叉链表中含有2n2n个指针域,其中必有个指针域,其中必有n n1 1个空的链域。个空的链域。1.1.二叉链表二叉链表32typedef struct BiTNode /结点结构结点结构 TElemType data;struct BiTNode *lchild,*rchild;/左右孩子指针 BiTNode,*BiTree;lchild data rchild结点结构结点结构:C 语言的类型描述如下语言的类型描述如下:33rootADEBCF 2三叉链表三叉链表34三叉链表类型表述如下:typedef char DataType;typedef struct
15、 Node DataType data;struct Node*parent;struct Node*lchild;struct Node*rchild;BiTNode,*BiTree;结点结构:lchild data rchildparent356.4二叉树的遍历二叉树的遍历一、遍历的含义一、遍历的含义三、算法的递归描述三、算法的递归描述四四、二叉树的应用举例二叉树的应用举例二、先左后右的遍历算法二、先左后右的遍历算法36五、由遍历序列确定五、由遍历序列确定二叉树二叉树遍历:遍历:按按一定规律一定规律访问访问二叉树中的每个结点,使二叉树中的每个结点,使得每个结点均被得每个结点均被访问一次访问
16、一次,而且,而且仅被访问一次仅被访问一次。“访问”的含义可以很广,如:输出结点的信息等。一、遍历的含义一、遍历的含义非线性的树线性化的结点访问序列遍历遍历目的:二叉树是非线性结构,每个结点有两个后继,二叉树是非线性结构,每个结点有两个后继,遍历时存在遍历时存在如何遍历如何遍历的问题,即按什么样的的问题,即按什么样的规律规律(搜索路径搜索路径)访问结点访问结点?37 对对“二二叉叉树树”而而言言,可可以以有有三三条条搜搜索索路径:路径:1先上后下先上后下的按层次遍历;2先左先左(子树)后右后右(子树)的遍历;3先右先右(子树)后左后左(子树)的遍历。二叉树的基本结构由二叉树的基本结构由根结点根结
17、点、左子树左子树和和右子树右子树组成组成:RChildDataLChildDataLChildLChildRChild38二叉树的搜索路径二叉树的搜索路径(先左后右先左后右):39BDCEF第一次经过第一次经过B第二次经过第二次经过B第三次经过第三次经过B问题:那一次经过时访问问题:那一次经过时访问B?二、先左后右的遍历算法二、先左后右的遍历算法先先(根)序的遍历算法DLR中中(根)序的遍历算法LDR后后(根)序的遍历算法LRD根根左子树右子树根根根根根根根根根根401 1、先序遍历(、先序遍历(DLRDLR)操作过)操作过程程 若二叉树为空树,则空操作;否则,若二叉树为空树,则空操作;否则,
18、(1)访问根结点;)访问根结点;(2)先序遍历左子树;)先序遍历左子树;(3)先序遍历右子树。)先序遍历右子树。412 2、中序遍历(、中序遍历(LDRLDR)操作过)操作过程程 若二叉树为空树,则空操作;否则,若二叉树为空树,则空操作;否则,(1)中序遍历左子树;)中序遍历左子树;(2)访问根结点;)访问根结点;(3)中序遍历右子树。)中序遍历右子树。423 3、后序遍历(、后序遍历(LRDLRD)操作过)操作过程程 若二叉树为空树,则空操作;否则,若二叉树为空树,则空操作;否则,(1)后序遍历左子树;)后序遍历左子树;(2)后序遍历右子树;)后序遍历右子树;(3)访问根结点。)访问根结点。
19、43ABCDEFGHK例如:例如:先序序列:先序序列:中序序列:中序序列:后序序列:后序序列:A B C D E F G H KB D C A E H G K FD C B H K G F E A44abcdefghij又如:先序遍历先序遍历:a b d h i e j c f g中序遍历中序遍历:h d i b j e a f c g后序遍历后序遍历:h i d j e b f g c a45用二叉树表示表达式用二叉树表示表达式-+/a*efb-cd先序先序:-+a*b-cd/ef:-+a*b-cd/ef中序中序:a+b*c-d-e/f:a+b*c-d-e/f后序后序:abcd-*+ef/-
20、:abcd-*+ef/-三个序列恰好为它的三个序列恰好为它的前缀、前缀、中缀、中缀、后缀后缀表示式表示式原式原式:a+b*(c-d)-e/f:a+b*(c-d)-e/f46三、遍历算法的递归描述 1 1、先序遍历先序遍历void PreOrder(BiTree BiTree root)/*先序遍历二叉树先序遍历二叉树,root为二叉树根结点的指针为二叉树根结点的指针*/if(root!=NULL)Visit(root-data);/*访问根结点访问根结点*/PreOrder(root-LChild);/*先序遍历左子树先序遍历左子树*/PreOrder(root-RChild);/*先序遍历右
21、子树先序遍历右子树*/47void InOrder(BiTree root)/*中中序序遍遍历历二二叉叉树树,root为为二二叉叉树树根根结结点点的的指指针针*/if(root!=NULL)InOrder(root-LChild);/*中序遍历左子树中序遍历左子树*/Visit(root-data);/*访问根结点访问根结点*/InOrder(root-RChild);/*中序遍历右子树中序遍历右子树*/2、中序遍历483、后序遍历void PostOrder(BiTree root)/*后序遍历二叉树,后序遍历二叉树,root为二叉树根结点的指针为二叉树根结点的指针*/if(root!=NU
22、LL)PostOrder(root-LChild);/*后后序序遍遍历历左左子子树树*/PostOrder(root-RChild);/*后后序序遍遍历历右右子子树树*/Visit(root-data);/*访问根结点访问根结点*/49作业P135l2补充1:有3个结点的树有几种形态?有3个结点的二叉树有几种形态?50四四、二叉树的应用举例二叉树的应用举例3、统计二叉树中叶子结点的个数、统计二叉树中叶子结点的个数4、求二叉树的深度、求二叉树的深度1 1、输出二叉树中的结点、输出二叉树中的结点(先序遍历先序遍历)2 2、输出二叉树中的叶子结点、输出二叉树中的叶子结点511.在二叉树不空的前提下,
23、输出二叉树的根节点;2.输出二叉树的左子树;1、输出二叉树中的结点算法基本思想算法基本思想:3.输出二叉树的右子树;52void Preorder(BiTree root)if(root!=NULL)printf(“%c”,root-data);Preorder(root-lchild);Preorder(root-rchild);1、输出二叉树中的结点说明:输出二叉树中结点无次序要求,三 种遍历都可用。532、输出二叉树中的叶子结点输出二叉树中的叶子结点void PreOrder(BiTree BiTree root)/*先先序序遍遍历历输输出出二二叉叉树树中中叶叶结结点点,root为为二二
24、叉叉树树根根结结点点的的指针指针*/if(root!=NULL)if(root-LChild=NULL&root-RChild=NULL)printf(root-data);/*输出叶结点输出叶结点*/PreOrder(root-LChild);/*先序遍历左子树先序遍历左子树*/PreOrder(root-RChild);/*先序遍历右子树先序遍历右子树*/543、统计二叉树中叶子结点的个数、统计二叉树中叶子结点的个数算法基本思想算法基本思想:先序(或中序或后序)遍历二叉树,在遍历过程中查找叶子结点,并计数。由此,需在遍历算法中增添一个需在遍历算法中增添一个“计数计数”的参数,的参数,并将算
25、法中“访问结点”的操作改为:若是叶子,则计数器增若是叶子,则计数器增1 1。55void leaf(BiTree root)void leaf(BiTree root)if(root!=NULL)if(root!=NULL)leaf(root-LChild);leaf(root-LChild);leaf(root-RChild);leaf(root-RChild);if(root-LChild=NULL&root-RChild=NULL)LeafCount+;LeafCount+;方法一:设全局变量方法一:设全局变量LeafCount计叶子结点数目,计叶子结点数目,调用前赋初值为调用前赋初值为
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 第六 二叉 课件
限制150内