数据结构树与二叉树.ppt
《数据结构树与二叉树.ppt》由会员分享,可在线阅读,更多相关《数据结构树与二叉树.ppt(137页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、6.1 树的类型定义树的类型定义6.2 二叉树的类型定义二叉树的类型定义6.3 二叉树的存储结构二叉树的存储结构6.4 二叉树的遍历二叉树的遍历6.5 线索二叉树线索二叉树6.6 树和森林的表示方法树和森林的表示方法6.7 树和森林的遍历树和森林的遍历6.8 哈夫曼树与哈夫曼编码哈夫曼树与哈夫曼编码目目 录录6.1 树的类型定义树的类型定义数据对象数据对象 D:D是具有相同特性的数据元素的集合。是具有相同特性的数据元素的集合。若若D为空集,为空集,则称为空树;则称为空树;否则否则:(1)在在D中存在唯一的称为根的数据元素中存在唯一的称为根的数据元素root,(2)当当n1时,其余结点可分为时,
2、其余结点可分为m(m0)个互个互 不相交的有限集不相交的有限集T1,T2,Tm,其中每一其中每一 个子集本身又是一棵符合本定义的树,个子集本身又是一棵符合本定义的树,称为根称为根root的子树。的子树。数据关系数据关系 R:ADTA AB BC CD DE EF FGGHHI IJ JKKL LMM2023/5/205树的示例树的示例A AB BC CD DE EF FGGHHI IJ JKKL LMMA AB BC CD DE EF FGGHHI IJ JKK L LMMA AB BC CD DE EF FGGHHI IJ JKK L LMM 基本操作:基本操作:查查 找找 类类 插插 入入
3、 类类删删 除除 类类Root(T)/求树的根结点求树的根结点 Value(T,cur_e)/求当前结点的元素值求当前结点的元素值 Parent(T,cur_e)/求当前结点的双亲结点求当前结点的双亲结点LeftChild(T,cur_e)/求当前结点的最左孩子求当前结点的最左孩子 RightSibling(T,cur_e)/求当前结点的右兄弟求当前结点的右兄弟TreeEmpty(T)/判定树是否为空树判定树是否为空树 TreeDepth(T)/求树的深度求树的深度TraverseTree(T,Visit()/遍历遍历查找类操作查找类操作InitTree(&T)/初始化置空树初始化置空树 Cr
4、eateTree(&T,definition)/按定义构造树按定义构造树Assign(T,cur_e,value)/给当前结点赋值给当前结点赋值InsertChild(&T,&p,i,c)/将以将以c为根的树插入为结点为根的树插入为结点p的第的第i棵子树棵子树插入类操作插入类操作 ClearTree(&T)/将树清空将树清空 DestroyTree(&T)/销毁树的结构销毁树的结构DeleteChild(&T,&p,i)/删除结点删除结点p的第的第i棵子树棵子树删除类操作删除类操作()有确定的根;有确定的根;()树根和子树根之间为有向关系。树根和子树根之间为有向关系。有向树有向树有序树有序树子
5、树之间存在确定的次序关系。子树之间存在确定的次序关系。无序树无序树子树之间不存在确定的次序关系。子树之间不存在确定的次序关系。对比对比树型结构树型结构和和线性结构线性结构的结构特点的结构特点线性结构线性结构树型结构树型结构第一个数据元素第一个数据元素 (无前驱无前驱)根结点根结点 (无前驱无前驱)最后一个数据元素最后一个数据元素 (无后继无后继)多个叶子结点多个叶子结点 (无后继无后继)其它数据元素其它数据元素(一个前驱、一个前驱、一个后继一个后继)其它数据元素其它数据元素(一个前驱、一个前驱、多个后继多个后继)基基 本本 术术 语语结点结点:结点的度结点的度:树的度树的度:叶子结点叶子结点:
6、分支结点分支结点:数据元素数据元素+若干指向子树的分支若干指向子树的分支分支的个数分支的个数树中所有结点的度的最大值树中所有结点的度的最大值度为零的结点度为零的结点度大于零的结点度大于零的结点DHIJM(从根到结点的从根到结点的)路径路径:孩子孩子结点结点、双亲双亲结点结点、兄弟兄弟结点结点、堂兄弟堂兄弟结点结点祖先祖先结点结点、子孙子孙结点结点结点的层次结点的层次:树的深度树的深度:由从根到该结点由从根到该结点所经分支和结点构成所经分支和结点构成ABCDEFGHIJMKL假设根结点的层次为假设根结点的层次为1,1,第第l 层的层的结点的子树根结点的层次为结点的子树根结点的层次为l+1树中叶子
7、结点所在的最大层次树中叶子结点所在的最大层次任何一棵非空树是一个二元组任何一棵非空树是一个二元组 Tree=(root,F)其中:其中:root 被称为根结点,被称为根结点,F 被称为子树森林被称为子树森林森林森林:是是m(m0)棵互)棵互不相交的树的集合不相交的树的集合ArootBCDEFGHIJMKLF6.2 二叉树的类型定义二叉树的类型定义 二叉树或为空树;或是由一个根结二叉树或为空树;或是由一个根结点加上两棵分别称为点加上两棵分别称为左子树左子树和和右子树右子树的、的、互不交的互不交的二叉树组成。二叉树组成。ABCDEFGHK根结点根结点左子树左子树右子树右子树NNNNLRRL空树空树
8、只含根结点只含根结点右子树为空树右子树为空树左子树为空树左子树为空树左右子左右子树均不树均不为空树为空树二叉树的五种基本形态:二叉树的五种基本形态:查查 找找 类类插插 入入 类类删删 除除 类类 二叉树的主要基本操作二叉树的主要基本操作 Root(T);Value(T,e);Parent(T,e);LeftChild(T,e);RightChild(T,e);LeftSibling(T,e);RightSibling(T,e);BiTreeEmpty(T);BiTreeDepth(T);PreOrderTraverse(T,Visit();InOrderTraverse(T,Visit();
9、PostOrderTraverse(T,Visit();LevelOrderTraverse(T,Visit();查查 找找 类类 操操 作作 InitBiTree(&T);Assign(T,&e,value);CreateBiTree(&T,definition);InsertChild(T,p,LR,c);插插 入入 类类 操操 作作ClearBiTree(&T);DestroyBiTree(&T);DeleteChild(T,p,LR);删删 除除 类类 操操 作作二叉树二叉树的重要特性的重要特性性质性质1:在二叉树的第在二叉树的第 i 层上至多有层上至多有2i-1 个结点。个结点。(i
10、1)用归纳法证明用归纳法证明:归纳基:归纳基:归纳假设:归纳假设:归纳证明:归纳证明:i=1 层时,只有一个根结点,层时,只有一个根结点,2i-1=20=1;假设对所有的假设对所有的 j,1 j i,命题成立命题成立;二叉树上每个结点至多有两棵子树,二叉树上每个结点至多有两棵子树,则第则第 i 层的结点数层的结点数=2i-2 2=2i-1。性质性质 2:深度为深度为 k 的二叉树上至多含的二叉树上至多含 2k-1 个个结点(结点(k1)证明:证明:基于上一条性质,深度为基于上一条性质,深度为 k 的二叉的二叉树上的结点数至多为树上的结点数至多为 20+21+2k-1=2k-1 性质性质 3:对
11、任何一棵二叉树,若它含有对任何一棵二叉树,若它含有n0 个叶个叶子结点、子结点、n2 个度为个度为 2 的结点,则必存在的结点,则必存在关系式:关系式:n0=n2+1证明:证明:设设 二叉树上结点总数二叉树上结点总数 n=n0+n1+n2又又 二叉树上分支总数二叉树上分支总数 b=n1+2n2 而而 b=n-1=n0+n1+n2-1由此,由此,n0=n2+1满二叉树:满二叉树:深度深度为为k且含有且含有2k-1个个结点的二叉树。结点的二叉树。完全二叉树完全二叉树:树树中所含的中所含的 n 个结点个结点和满二叉树中和满二叉树中编号编号为为 1 至至 n 的结点的结点一一一对应。一对应。12345
12、6789 10 11 12 13 14 15abcdefghij两类两类特殊特殊的二叉树:的二叉树:证明:证明:设设 完全二叉树的深度为完全二叉树的深度为 k 则根据第二条性质得则根据第二条性质得 2k-1 n 2k 即即 k-1 log2 n n,则该结点无左孩子,则该结点无左孩子,否则,编号为否则,编号为 2i 的结点为其的结点为其左孩子左孩子结点;结点;(3)若若 2i+1n,则该结点无右孩子结点,则该结点无右孩子结点,否则,编号为否则,编号为2i+1 的结点为其的结点为其右孩子右孩子结点结点。性质性质 5:二二.二叉树的链式二叉树的链式 存储表示存储表示一一.二叉树的顺序二叉树的顺序
13、存储表示存储表示6.3 二叉树的存储结构二叉树的存储结构#define MAX_TREE_SIZE 100 /二叉树的最大结点数二叉树的最大结点数typedef TElemType SqBiTreeMAX_TREE_SIZE;/0号单元存储根结点号单元存储根结点SqBiTree bt;一一.二叉树的顺序存储表示二叉树的顺序存储表示 A B D C E FABCDEF 0 1 2 3 4 5 6 7 8 9 10 11 12 13 142511437例如例如:1.二叉链表二叉链表2三叉链表三叉链表3双亲链表双亲链表4线索链表线索链表二二.二叉树的链式存储表示二叉树的链式存储表示ADEBCF ro
14、otlchild data rchild结点结构结点结构:1.1.二叉链表二叉链表typedef struct BiTNode /结点结构结点结构 TElemType data;struct BiTNode *lchild,*rchild;/左、右孩子指针左、右孩子指针 BiTNode,*BiTree;lchild data rchild结点结构结点结构:C 语言的类型描述如下语言的类型描述如下:ADEBCF root parent lchild data rchild结点结构结点结构:2三叉链表三叉链表 typedef struct TriTNode /结点结构结点结构 TElemType
15、data;struct TriTNode *lchild,*rchild;/左、右孩子指针左、右孩子指针 struct TriTNode *parent;/双亲指针双亲指针 TriTNode,*TriTree;parent lchild data rchild结点结构结点结构:C 语言的类型描述如下语言的类型描述如下:LRRRL0123456 data parent结点结构结点结构:LRTag3 3双亲链表双亲链表 typedef struct BPTNode /结点结构结点结构 TElemType data;int parent;/指向双亲的指针指向双亲的指针 char LRTag;/左、右
16、孩子标志域左、右孩子标志域 BPTNode typedef struct BPTree/树结构树结构 BPTNode nodesMAX_TREE_SIZE;int num_node;/结点数目结点数目 int root;/根结点的位置根结点的位置 BPTree6.4二叉树的遍历二叉树的遍历一、问题的提出一、问题的提出二、先左后右的遍历算法二、先左后右的遍历算法三、算法的递归描述三、算法的递归描述四、中序遍历算法的非递归描述四、中序遍历算法的非递归描述五五、遍历算法的应用举例遍历算法的应用举例 顺着某一条搜索路径顺着某一条搜索路径巡访巡访二叉树二叉树中的结点,使得每个结点中的结点,使得每个结点均
17、被访问一均被访问一次次,而且,而且仅被访问一次仅被访问一次。一.问题的提出“访问访问”的含义可以很广,如:输出结的含义可以很广,如:输出结点的信息等。点的信息等。“遍历遍历”是任何类型均有的操作,是任何类型均有的操作,对线性结构而言,只有一条搜索路对线性结构而言,只有一条搜索路径径(因为每个结点均只有一个后继因为每个结点均只有一个后继),故不需要另加讨论。而二叉树是非故不需要另加讨论。而二叉树是非线性结构,每个结点有两个后继,线性结构,每个结点有两个后继,则存在如何遍历即按什么样的则存在如何遍历即按什么样的搜索搜索路径路径遍历的问题。遍历的问题。对对“二二叉叉树树”而而言言,可可以以有有三条搜
18、索路径:三条搜索路径:1先上后下先上后下的按层次遍历;的按层次遍历;2先左先左(子树子树)后右后右(子树子树)的遍历;的遍历;3先右先右(子树子树)后左后左(子树子树)的遍历。的遍历。先先(根)序的遍历算法(根)序的遍历算法中中(根)序的遍历算法(根)序的遍历算法后后(根)序的遍历算法(根)序的遍历算法二.先左后右的遍历算法 若二叉树为空树,则空操作;否则,若二叉树为空树,则空操作;否则,(1)访问根结点;)访问根结点;(2)先序遍历左子树;)先序遍历左子树;(3)先序遍历右子树。)先序遍历右子树。先(根)序的遍历算法:先(根)序的遍历算法:若二叉树为空树,则空操作;否则,若二叉树为空树,则空
19、操作;否则,(1)中序遍历左子树;)中序遍历左子树;(2)访问根结点;)访问根结点;(3)中序遍历右子树。)中序遍历右子树。中(根)序的遍历算法:中(根)序的遍历算法:若二叉树为空树,则空操作;否则,若二叉树为空树,则空操作;否则,(1)后序遍历左子树;)后序遍历左子树;(2)后序遍历右子树;)后序遍历右子树;(3)访问根结点。)访问根结点。后(根)序的遍历算法:后(根)序的遍历算法:void Preorder(BiTree T,void(*visit)(TElemType&e)/先序遍历二叉树先序遍历二叉树 if(T)visit(T-data);/访问结点访问结点 Preorder(T-lc
20、hild,visit);/遍历左子树遍历左子树 Preorder(T-rchild,visit);/遍历右子树遍历右子树 三.算法的递归描述BiTNode*GoFarLeft(BiTree T,Stack&S)if(!T)return NULL;while(T-lchild)/直到最左端直到最左端 Push(S,T);T=T-lchild;return T;四.中序遍历算法的非递归描述abcdefghijvoid Inorder_I(BiTree T,void(*visit)(TelemType&e)Stack S;InitStack(S);t=GoFarLeft(T,S);/找到最左下的结点
21、找到最左下的结点 while(t)visit(t-data);if(t-rchild)t=GoFarLeft(t-rchild,S);else if(!StackEmpty(S)/栈不空时退栈栈不空时退栈 t=Pop(S);else t=NULL;/栈空表明遍历结束栈空表明遍历结束 1.统计二叉树中叶子结点的个数统计二叉树中叶子结点的个数 (先序遍历,先序遍历,习题习题6.42)2.求二叉树的深度求二叉树的深度 (后序遍历,后序遍历,参见参见习题习题6.44)3.复制二叉树复制二叉树 (后序遍历,后序遍历,参见参见习题习题6.46)4.4.建立二叉树的存储结构建立二叉树的存储结构五.遍历算法的
22、应用举例算法基本思想算法基本思想:先序先序(或中序或后序或中序或后序)遍历二叉树,在遍历二叉树,在遍历过程中查找叶子结点,并计数。遍历过程中查找叶子结点,并计数。因此,需在遍历算法中增添一个因此,需在遍历算法中增添一个“计计数数”的参数,并将算法中的参数,并将算法中“访问结点访问结点”的的操作改为操作改为:若是叶子,则计数器增若是叶子,则计数器增1 1。1.统计二叉树中叶子结点的个数统计二叉树中叶子结点的个数(习题习题6.42)void CountLeaf(BiTree T,int&count)if(T)/初值为初值为0 if(!T-lchild&!T-rchild)count+;/对叶子结点
23、计数对叶子结点计数 CountLeaf(T-lchild,count);CountLeaf(T-rchild,count);调用:调用:num0;CountLeaf(T,num););算法基本思想算法基本思想:从二叉树深度的定义可知,二叉树的从二叉树深度的定义可知,二叉树的深度应为其左、右子树深度的最大值加深度应为其左、右子树深度的最大值加1 1。由此,需先分别求得左、右子树的深度,由此,需先分别求得左、右子树的深度,算法中算法中“访问结点访问结点”的操作为的操作为:求得左、求得左、右子树深度的最大值,然后加右子树深度的最大值,然后加 1 1。首先分析二叉树的深度和它的左、首先分析二叉树的深度
24、和它的左、右子树深度之间的关系。右子树深度之间的关系。2.求二叉树的深度求二叉树的深度(后序遍历后序遍历)(参见(参见习题习题6.44)int Depth(BiTree T)/返回二叉树的深度返回二叉树的深度 if(!T)depthval=0;else depthLeft =Depth(T-lchild);depthRight=Depth(T-rchild);depthval=1+(depthLeft depthRight?depthLeft:depthRight);return depthval;其基本操作为其基本操作为:生成一个结点。生成一个结点。根元素根元素T左子树左子树右子树右子树根元
25、素根元素NEWT左子树左子树右子树右子树左子树左子树右子树右子树(后序遍历后序遍历)3.复制二叉树复制二叉树(参见(参见习题习题6.46)BiTNode*GetTreeNode(TElemType item,BiTNode*lptr,BiTNode*rptr)if(!(T=(BiTNode*)malloc(sizeof(BiTNode)exit(1);T-data=item;T-lchild=lptr;T-rchild=rptr;return T;生成二叉树的一个结点生成二叉树的一个结点(其数据域为其数据域为item,左指针域为左指针域为lptr,右指针域为右指针域为rptr)BiTNode*
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 二叉
限制150内