收藏 分享(赏)

数据结构06gj.ppt

上传人:hwpkd79526 文档编号:8269932 上传时间:2019-06-17 格式:PPT 页数:76 大小:920KB
下载 相关 举报
数据结构06gj.ppt_第1页
第1页 / 共76页
数据结构06gj.ppt_第2页
第2页 / 共76页
数据结构06gj.ppt_第3页
第3页 / 共76页
数据结构06gj.ppt_第4页
第4页 / 共76页
数据结构06gj.ppt_第5页
第5页 / 共76页
点击查看更多>>
资源描述

1、第六章 树和二叉树,树的结构特点,树型结构是以分支关系定义的层次结构,任意一棵非空树中:(1)有且仅有一个特定 的称为根的结点;(2)当n1时,其余结点为分为 m个互不相交的有限集T1,T2,T m,每一个子集本身 也是一棵树。树型结构在编译程序中,可用来表示源程序 的语法结构。在数据库系统中,树型结构也是信 息的重要组织形式之一。,6.1 树的定义和基本术语 6.2 二叉树 6.3 遍历二叉树和线索二叉树 6.4 树和森林 6.6 赫夫曼树及其应用,主要内容,是一类重要的非线性结构, 是以 分支关系定义的层次结构。,A,(a) (b) (c),树的例子:,树型结构,现实世界:如家谱、行政组织

2、机构等。 计算机领域:编译程序、数据库系统等。,树(Tree)的定义:n个结点组成的有限集合。 满足如下两个条件(非空树):,6.1 树的定义和基本术语,(2)当n1时,根结点以外的其它结点可分m(m0)个互不相交的有限集合T1, T2, Tm。 其中 Ti称为子树。每棵子树的根结点有且仅有一个直接前驱,但可以有0个或多个直接后继。,(1)有且仅有一个特定的根(Root)结点;,(A(B(E(K,L),F),C(G),D(H(M),I,J) 嵌套括号表示法,凹入表,树的表示方法,结点 结点的度 叶子(终端结点) 分枝结点(非终端结点) 树的度 孩子结点 双亲结点 兄弟结点 祖先结点 子孙结点

3、层次 树的高度(深度) 有序树 无序树森林(树林),基本术语,InitTree(&T) 构造空树T。 Root(T) 求树T的根结点。 Parent(T,x) 求树T中值为x的结点的双亲。 Child(T,x,i) 求树T中值为x的结点的第i个孩子。 AddChild(T,y,i,x) 树T中将值为x的结点作为值 y的结点的第i个孩子插入到树中。 DelChild(T,x,i)删除值为x的结点的第i个孩子。 Traverse(T) 遍历或访问树T。,树的基本运算,二叉树的定义每个结点至多只有两棵子树,并且,,6.2 二叉树,二叉树的子树有左右之分,其次序不 能任意颠倒。,二叉树的5种形式,(a

4、) 空二叉树,(b) 仅有根结点的二叉树,(c) 右子树为空的二叉树,(e) 左子树为空的二叉树,(d) 根和左右子树,A,二叉树的性质,性质1:第i层上至多有2i-1个结点(i1)。 性质2:深度为k的二叉树至多有2k1个结点 性质3:对任何一棵二叉树,如果其终端结点数为n0,度为2的结点数为n2,则n0n2+1. 性质4:具有n个结点的完全二叉树的深度为log2n1。,二叉树的性质(续),性质5: n个结点的完全二叉树的结点按层序编号,则对任一结点i (1in),有: (1)如果i1,则结点i无双亲,是二叉树的根; 果i1,则其双亲是结点i/2。 (2)如果2in,则结点i为叶子结点,无左

5、孩子; 否则(即:2in),其左孩子是结点2i; (3)如果2i1n,则结点i无右孩子; 否则(即:2i+1n) ,其右孩子是结点2i1。,特殊形态的二叉树,二叉树的抽象定义,ADT BinaryTree数据对象D:D是具有相同特性的数据元素的集合。数据关系R:若D=空集,R为空集,称为空二叉 树;若D为非空,R为二元关系。基本操作P: ADT BinaryTree,InitBiTree(&T) 构造空二叉树T。 DestroyBiTree(&T)销毁二叉树T。 Root(T) 求T的根结点。 Parent(T,e) 求T中值为e的结点的双亲。 LChild(T,e)/RChild(T,e)

6、求T中值为e的结点的左/右孩子。 LBrother(T,e)/RBrother(T,e)求T中值为e的结点的左/右兄弟。,二叉树的基本操作,二叉树的基本操作(续),Traverse(T) 遍历二叉树T。 AddLChild(&T,x,y)/AddRChild(&T,x,y) 在T中,将值为y的结点作为值为x的结点的左/ 右孩子插入。 DelLChild(&T,x)/DelRChild(&t,x)在T中,删除值为x的结点的左/右孩子。,1、顺序存储结构 顺序存放到一个一维数组中。 #define MAX_TREE_SIZE 100 typedef TElemType SqBiTreeMAX_TR

7、EE_SIZE ; SqBiTree bt;,0 1 2 3 4 5 6 7 8 9 10 11,完全二叉树,二叉树的存储结构,一般二叉树,表示该处没有元素存在。,存储特点:适用于完全二叉树;对于非完全二叉树,将浪费大量存贮单元;不适合需要经常插入、删除树中结点的操作。,若该二叉树为非完全二叉树,则必须将相应位置空出来,使存放的结果符合完全二叉树形状。,2、二叉链表法,二叉树的存储结构(续),/-二叉树的二叉链表存储表示- typedef struct BiTNodeTElemType data;struct BiTNode *lchild,*rchild; BiTNode,*BiTree;,

8、二叉树的链表存储,基本操作函数原型,Status CreateBiTree(BiTree &T); /按先序次序输入二叉树中结 点的值(一个字符), /构造二叉链表表示的二叉树T。,Status PreOrderTraverse(BiTree T, Status (*Visit)(BiTree t); /先序遍历,Status InOrderTraverse(BiTree T, Status (*Visit)(BiTree t); /中序遍历,基本操作函数原型(续),Status PostOrderTraverse(BiTree T, Status (*Visit)(TElemType e);

9、 /后序遍历,Status LevelOrderTraverse(BiTree T, Status (*Visit)(TElemType e); /层序遍历,6.3.1遍历二叉树 按某路径对树中每个结点访问一次且仅一 次。 二叉树的三个基本组成单元: 根结点(D)、左子树(L)和右子树(R)。 遍历二叉树的三种方案 先序遍历 DLR 中序遍历 LDR 后序遍历 LRD,6.3 遍历二叉树和线索二叉树,先序遍历序列:DLR,A,B,D,E,H,I,K,C,F,G,J,先序遍历示例,中序遍历序列:LDR,D,B,H,E,K,I,A,F,C,G,J,中序遍历示例,后序遍历序列:LRD,D,H,K,I

10、,E,B,F,J,G,C,A,后序遍历示例,最简单的Visit函数,Status PrintElement(TElemType e)printf(e); /输出元素e的值return OK;/返回成功标志 /前向遍历原型 /PreOrderTraverse(BiTree T,Status(*Visit)(TElemTyep e) /调用实例:PreOrderTraverse(T,PrintElement),函数的声明定义和调用?,Status PreOrderTraverse(BiTree T, Status (*Visit)(BiTree t)if(T)if(*Visit)(T) /访问结点

11、if(PreOrderTraverse(T-lchild,Visit)if(PreOrderTraverse(T-rchild,Visit)return OK;return ERROR;else return OK; ,PreOrderTraverse,后序和中序遍历?,何时访问了数据,/中序遍历 Status InOrderTraverse(BiTree T, Status (*Visit)(BiTree t) if(T)if(InOrderTraverse(T-lchild, Visit)if(*Visit)(T) if(InOrderTraverse(T-rchild, Visit)re

12、turn OK;return ERROR;else return OK; ,InOrderTraverse,/后序遍历 Status PostOrderTraverse(BiTree T, Status (*Visit)(BiTree e)if(T)if(PostOrderTraverse(T-lchild,Visit)if(PostOrderTraverse(T-rchild,Visit)if(*Visit)(T) /访问结点return OK;return ERROR;else return OK; ,PostOrderTraverse,Status CreateBiTree(BiTree

13、 ,CreateBiTree,后序和中序遍历?,Status InOrderTraverse(BiTree T, Status (*Visit)(BiTree t)InitStack(S);Push(S,T);/根指针进栈while(!StackEmpty(S); /左走到尽头while(GetTop(S,p)/ /向右一步 /while ,InOrderTraverse,Status InOrderTraverse(BiTree T, Status (*Visit)(BiTree t)InitStack(S);p=T;while(p|!StackEmpty(S)if(p) Push(S,p)

14、;p=p-lchild/根进历左else/根退历右Pop(S,p);if (!Vist(p-data) return/移动指针左右移动 ERROR;p=p-rchild;/else /whilereturn OK; /InOrderTraverse,InOrderTraverse,Status CreateBiTree(BiTree ,CreateBiTree,void PreOrderNRTraverse(BiTree T, Status (*Visit)(BiTree t) BiTree p,s100;int top=0; /top为栈顶指针p=T;while( p | top0 )whi

15、le(p)(*Visit)(p);stop+=p;p=p-lchild; p=s-top; p=p-rchild; ,了解,void InOrderNRTraverse(BiTree T,Status (*Visit)(BiTree t)BiTree p,s100; /s为一个栈int top=0; p=T; while( p | top0 )while(p)stop+=p;p=p-lchild;p=s-top;(*Visit)(p); p=p-rchild; ,了解,void PostOrderNRTraverse(BiTree T, Status (*Visit)(BiTree t)BiT

16、ree p,s1100; /s1栈存放结点int b,top=0,s2100; p=T;/s2栈存放进栈标志dowhile(p) s1top = p; s2top+ = 0;p=p-lchild; /第一次标志为0if(top0) b=s2-top; p=s1top;if(b=0) s1top=p;s2top+=1;/第二次标志为1p=p-rchild;else (*Visit)(p); p=NULL; while(top0); ,了解,Status PreOrderNoRecursionTraverse(BiTreeT,Status (*Visit)(BiTree t)BiTree stac

17、kMaxSize,p; int top;if(T) top=0; stacktop+=T; /根结点入栈while(top0) /栈不为空时循环p=stack-top;/退栈并访问该结点(*Visit)(p);if(p-rchild)/右孩子入栈stacktop+=p-rchild;if(p-lchild)/左孩子入栈stacktop+=p-lchild; return OK; ,先序非递归遍历,利用二叉链表的空链域来存放结点的前驱和后继的信息。 规定:若结点有左子树,则其lchild域指示其左孩子,否则令lchild指示其前驱;若结点有右子树,则其rchild域指示其右孩子,否则令rchil

18、d指示其后继。 结点结构增加标志域,6.3.2 线索二叉树(了解),线索二叉树的结点结构(了解),/-二叉树的二叉线索存储表示- typedef enumLink,ThreadPointerTag; /Link:指针,Thread:线索 typedef struct BiThrNodeTElemType data;struct BiTreeNode *lchild,*rchild;PointerTag LTag, Rtag; BiTreeNode,*BiThrTree;,二叉线索存储(了解),双亲表示法 孩子表示法 孩子兄弟表示法,6.4树和森林 6.4.1树的存储结构,用数组存储树的结点,每

19、个结点中附设一 字段指示其父结点的位置。,双亲表示法,/-树的双亲表存储表示- #define MAX_TREE_SIZE 100 typedef struct PTNode /树中结点的结构 TElemType data; int parent; /结点的双亲位置域 PTNode; typedef struct PTNode nodesMAX_TREE_SIZE; int r,n; /根的位置和结点数 PTree, *PPTree;,存储结构,孩子表示法 1.k叉树结点表示(固定长结点),2.变长结点表示,3.孩子链表表示,/-树的孩子链表存储表示- typedef struct EdgeN

20、ode/孩子链表中结点的结构int child;struct EdgeNode *next; EdgeNode; typedef struct /结点表中结点的结构TElemType data;struct EdgeNode *firstchild; /孩子链表头指针 CTNode; typedef struct /树结构CTNode nodesMAX_TREE_SIZE;int r,n; /根的位置和结点数 CTree, *PCTree;,带双亲的孩子表示法,结点: 数据 孩子 兄弟,孩子兄弟表示法(二叉树表示法),孩子兄弟表示法(二叉树表示法) 结点: 数据 孩子 兄弟,/-树的二叉链表(

21、孩子兄弟) 存储表示- typedef struct CSNodeTElemType data;struct CSNode *firstchild,*nextsibling; CSTree, *PCSTree;,存储表示,可以分为三步: (1)连线:相邻兄弟间连线。 (2)抹线:抹掉双亲与孩子间的连线(除左孩子) 。 (3)旋转:将树作适当的旋转。,6.4.2 森林和二叉树的转换 1、树转换成二叉树,树对应的二叉树示意图,(1)将森林中每一棵树分别转换成二叉树 (2)合并:使第n棵树接入到第n-1棵的成其右子树,第 n-1 棵二叉树接入到第n-2 棵的右边并成为它的右子树,第2棵二叉树接入到第

22、1棵的右边并成为它的右子树,直到最后剩下一棵二叉树为止。,2、森林转换成二叉树,森林所对应的二叉树,哈夫曼树,以称最优树,是一类带权路径长度最短的树。,6.6 赫夫曼树及其应用*,路径 树中结点之间的分支构成其路径。 路径长度 路径上的分支数目。从根结点到第L层结点的路径长度为L-1。 树的路径长度 树根到各结点路径长度之和。完全二叉树是路径长度最短的二叉树。 给结点赋予的特定数值,称为该结点的权。 结点的带权路径长度 从根结点到该结点之间的路径长度与该结点的权的乘积。 树的带权路径长度 所有叶子结点的带权路径长度之和,记为WPL= 。,6.6.1 基本术语,D到H的路径 DGH D到H路径的

23、长为2,A到H的路径 ADGH A到H路径的长为3,树的路径长度 =1+1+1+2+2+2+3+3=15,n个结点的二叉树路径长度最小的是完全二叉树,基本术语示例,A,B,C,D,E,F,G,H,I,每个叶子结点都带权的二叉树叫带权二叉树,7,5,2,4,A到C的带权路径的长,二叉树的带权路径的长,本树带权路径的长=7*3+5*2+2*3+4*3=49,带权路径的长WPL= wklk,k=1,n,二叉树带权路径的长,n个叶子结点权值分别为w1,w2,wn的二叉树中,带权路径长度WPL最小的二叉树。,5,2,7,4,5,2,7,4,WPL=49,WPL=(7+5+2+4)*2=36,最优二叉树(

24、 赫夫曼树),5,2,4,7,5,2,4,7,WPL=36,WPL=7+5*2+2*3+4*3=35,最优二叉树( 赫夫曼树续),将百分制转换成五级计分制if(a60) b=E;else if(a70) b=D;else if(a80) b=C;else if(a90) b=B;else b=A;,100个学生中5个不及格15个60几分40个70几分30个80几分10个90几分,5,15,40,30,10,需比较5+2*15+3*40+4*30+4*10 =315次,带权路径长度的例子,(1)根据给定的n个权值w1,w2,wn,构成n棵二叉树的集合F=T1,T2,Tn,Ti 为只有一个结点的树

25、,其权为wi。 (2)在F中选取两棵权值最小的作为左右子树构造一棵新二叉树,其根结点的权值为其左右子树权值之和。 (3)在F中删除这两棵树,同时将新得到的二叉树加入F中。 (4)重复(2)和(3),直到F中只含一棵树为止。该树即为赫夫曼树。,赫夫曼树算法,5,2,7,4,A,B,C,D,C,D,6,5,7,A,B,C,D,B,A,11,7,C,D,B,A,数字通信传输电文 ABACCDA 一般编码方案,电文 00010010101100 14位,岐义编码方案,A: 0 B: 00 C: 1 D: 01 不是,赫夫曼编码的应用,理想编码方案,通信中,可以采用0,1的不同排列来表示不同的字符,称为

26、二进制编码。在一个字符集中,任何一个字符的编码都不是另一个字符编码的前缀,这种编码称为前缀编码。可以利用二叉树来设计二进制的前缀编码。约定左分支表示字符0,右分支便是字符1,以分支字符串作为该叶子结点字符的编码。,6.6.2 哈夫曼编码,如何得到最短的二进制编码?用n个字符出现的频率作权,构造一颗赫夫曼树,来求得最短的二进制编码,称为赫夫曼编码。哈夫曼编码是一种不等长的二进制编码。在哈夫曼树中得到的叶子结点的编码为从根结点到叶子结点中所有路径中0、1的顺序排列。,哈夫曼编码,电文ABACCDA 01001101101110 14位,用二叉树设计前缀码,电文 ABACCDA字符出现的频度 A 3

27、次 B 1次 C 2次 D 1次构造一棵权为3,1,2,1 的赫夫曼树,电文 0110010101110 13位,赫夫曼编码设计示例,由于赫夫曼树中没有度为1的结点(这类树又称严格的(strict)(或正则的)二叉树);则一棵有n个叶子结点的赫夫曼树共有2n-1个结点(因n2=n0-1),可以存储在一个大小为2n-1的一维数组中。 如何选定结构类型? (1)编码需要从叶子到根 (2)译码需要从根到叶子对于每个结点,既要含双亲结点的信息,又要含孩子结点的信息。,赫夫曼编码和译码,树的计数,已知二叉树的遍历序列: 前序序列为ABECDFGHIJ, 中序序列为EBCDAFHIGJ, 求其树的构成以及后序遍历序列,前序序列为ABECDFGHIJ, 中序序列为EBCDAFHIGJ,二叉树构造,本章小结,掌握各种遍历二叉树的算法与实现。 掌握哈夫曼树的应用。 学会运用树的计数方法构造二叉树,本章作业,1.完成Huffman 编码的译码过程。 即输入一个码串,请翻译成相应的字符串。要求有编码过程和解码过程。,2.给定权值集合15, 03, 14, 02, 06, 09, 16, 17, 构造相应的赫夫曼树, 并计算它的带权外部路径长度,3.已知二叉树的前序序列为ABECDFGHIJ,中序序列为eBCDAFHIGJ,求其树的构成以及后序遍历序列,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报