第6章-树和二叉树_第1页
第6章-树和二叉树_第2页
第6章-树和二叉树_第3页
第6章-树和二叉树_第4页
第6章-树和二叉树_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

线性结构——一个对一个,如线性表、栈、队列树形结构——一个对多个,如树集合——数据元素间除“同属于一个集合”外,无其它关系图形结构——多个对多个,如图逻辑结构北京林业大学信息学院第6章树和二叉树教学内容6.1树的定义和基本术语6.2二叉树6.3遍历二叉树与线索二叉树6.4树和森林6.6霍夫曼树及其应用北京林业大学信息学院1.掌握树的相关概念

2.掌握二叉树的基本概念、基本性质和存储结构3.熟练掌握二叉树的前、中、后序遍历方法4.熟练掌握:霍夫曼树的实现方法、构造霍夫曼编码的方法5.了解:森林与二叉树的转换,树的遍历方法

教学目标北京林业大学信息学院6.1树的定义和基本术语树是n个结点的有限集T1T2T3北京林业大学信息学院(见教材P118-119)ADTTree{数据对象D:数据关系R:基本操作P:}ADTTree若D为空集,则称为空树;//允许n=0若D中仅含一个数据元素,则R为空集;其他情况下的R存在二元关系:①root唯一//关于根的说明②Dj∩Dk=Φ//关于子树不相交的说明③……//关于数据元素的说明D是具有相同特性的数据元素的集合。//至少有15个树的抽象数据类型定义北京林业大学信息学院凹入表示嵌套集合广义表树的其它表示方式北京林业大学信息学院根叶子

森林有序树无序树——即根结点(没有前驱)——即终端结点(没有后继)——指m棵不相交的树的集合(例如删除A后的子树个数)——结点各子树从左至右有序,不能互换(左为第一)——结点各子树可互换位置。基本术语北京林业大学信息学院——即上层的那个结点(直接前驱)——即下层结点的子树的根(直接后继)——同一双亲下的同层结点(孩子之间互称兄弟)——即双亲位于同一层的结点(但并非同一双亲)——即从根到该结点所经分支的所有结点——即该结点下层子树中的任一结点双亲孩子兄弟堂兄弟祖先子孙基本术语北京林业大学信息学院——即树的数据元素——结点挂接的子树数结点结点的度结点的层次终端结点分支结点树的度树的深度(或高度)——从根到该结点的层数(根结点算第一层)——即度为0的结点,即叶子——即度不为0的结点(也称为内部结点)——所有结点度中的最大值——指所有结点中最大的层数层次1234基本术语北京林业大学信息学院6.2二叉树普通树(多叉树)若不转化为二叉树,则运算很难实现为何要重点研究每结点最多只有两个“叉”的树?二叉树的结构最简单,规律性最强;可以证明,所有树都能转为唯一对应的二叉树,不失一般性。北京林业大学信息学院二叉树基本特点:结点的度小于等于2有序树(子树有序,不能颠倒)二叉树的五种不同形态北京林业大学信息学院具有3个结点的二叉树可能有几种不同形态?普通树呢?

练习5种/2种北京林业大学信息学院ADTBinaryTree{数据对象D:数据关系R:基本操作P:}ADTBinaryTree若D=Φ,则R=Φ;若D≠Φ,则R={H};存在二元关系:①root唯一//关于根的说明②Dl∩Dr=Φ//关于子树不相交的说明③……//关于数据元素的说明④……//关于左子树和右子树的说明D是具有相同特性的数据元素的集合。//至少有20个二叉树的抽象数据类型定义(见教材P121-122)北京林业大学信息学院性质1:在二叉树的第i层上至多有2i-1个结点二叉树的性质提问:第i层上至少有

个结点?性质2:深度为k的二叉树至多有2k-1个结点提问:深度为k时至少有

个结点?1k北京林业大学信息学院性质3:对于任何一棵二叉树,若2度的结点数有n2个,则叶子数n0必定为n2+1(即n0=n2+1)北京林业大学信息学院满二叉树:一棵深度为k且有2k-1个结点的二叉树。(特点:每层都“充满”了结点)特殊形态的二叉树完全二叉树:深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应只有最后一层叶子不满,且全部集中在左边北京林业大学信息学院满二叉树是叶子一个也不少的树,而完全二叉树虽然前n-1层是满的,但最底层却允许在右边缺少连续若干个结点。满二叉树是完全二叉树的一个特例。满二叉树和完全二叉树的区别北京林业大学信息学院一棵完全二叉树有5000个结点,可以计算出其叶结点的个数是()。练习2500北京林业大学信息学院性质4:具有n个结点的完全二叉树的深度必为[log2n]+1k层nk-1层北京林业大学信息学院性质5:对完全二叉树,若从上至下、从左至右编号,则编号为i的结点,其左孩子编号必为2i,其右孩子编号必为2i+1;其双亲的编号必为i/2。北京林业大学信息学院二叉树的顺序存储实现:按满二叉树的结点层次编号,依次存放二叉树中的数据元素。北京林业大学信息学院abcde0000fg012345678910abcdefg特点:结点间关系蕴含在其存储位置中浪费空间,适于存满二叉树和完全二叉树

单支树二叉树的顺序存储北京林业大学信息学院DATAPARENTLCHILDRCHILD二叉树的链式存储北京林业大学信息学院ABCDEFGAB

CD

E

F

G^^^^^^^^二叉链表typedef

struct

BiNode{

TElemTypedata;

struct

BiNode*lchild,*rchild;//左右孩子指针}BiNode,*BiTree;北京林业大学信息学院分析:必有2n个链域。除根结点外,每个结点有且仅有一个双亲,所以只会有n-1个结点的链域存放指针,指向非空子女结点。空指针数目=2n-(n-1)=n+1在n个结点的二叉链表中,有

个空指针域练习AB

CD

E

F

G^^^^^^^^n+1北京林业大学信息学院三叉链表ABCDEFGABCDEF

G^^^^^^^^^lchilddataparentrchildtypedef

struct

TriTNode

{TelemTypedata;

struct

TriTNode

*lchild,*parent,*rchild;

}TriTNode,*TriTree;北京林业大学信息学院6.3遍历二叉树和线索二叉树遍历定义——指按某条搜索路线遍访每个结点且不重复(又称周游)。遍历用途——它是树结构插入、删除、修改、查找和排序运算的前提,是二叉树一切运算的基础和核心。北京林业大学信息学院DLRDLRLDRLRDDRLRDLRLD遍历规则先左后右北京林业大学信息学院先序遍历:中序遍历:后序遍历:

ABCDEABDECDBEACDEBCA口诀:DLR—先序遍历,即先根再左再右LDR—中序遍历,即先左再根再右LRD—后序遍历,即先左再右再根北京林业大学信息学院+*A*/EDCB先序遍历+**/ABCDE前缀表示中序遍历A/B*C*D+E中缀表示后序遍历AB/C*D*E+后缀表示层序遍历+*E*D/CAB用二叉树表示算术表达式北京林业大学信息学院DLRADLRDLR>B>>D>>CDLRADBC先序遍历序列:ABDC若二叉树为空,则空操作否则

访问根结点(D)

前序遍历左子树(L)

前序遍历右子树(R)遍历的算法实现-先序遍历北京林业大学信息学院则三种遍历算法可写出:遍历的算法实现--用递归形式格外简单!longFactorial(longn){if(n==0)return1;//基本项

elsereturnn*Factorial(n-1);//归纳项}回忆:北京林业大学信息学院StatusPreOrderTraverse(BiTreeT){

if(T==NULL)returnOK;//非空二叉树

else{

cout<<T->data;//访问根结点

PreOrderTraverse(BiTreeT->lchild);

//递归遍历左子树

PreOrderTraverse(BiTreeT->rchild);

//递归遍历右子树

}}

先序遍历算法北京林业大学信息学院StatusPreOrderTraverse(BiTreeT){

if(T==NULL)returnOK;else{

cout<<T->data;

PreOrderTraverse(BiTreeT->lchild);

PreOrderTraverse(BiTreeT->rchild);}}主程序Pre(T)返回返回pre(TR);返回返回pre(TR);ACBDTBprintf(B);pre(TL);BTAprintf(A);pre(TL);ATDprintf(D);pre(TL);DTCprintf(C);pre(TL);C返回T>左是空返回pre(TR);T>左是空返回T>右是空返回T>左是空返回T>右是空返回pre(TR);先序序列:ABDC北京林业大学信息学院遍历的算法实现-中序遍历若二叉树为空,则空操作否则:

中序遍历左子树(L)

访问根结点(D)

中序遍历右子树(R)ADBCLDRBLDRLDR>A>>D>>CLDR中序遍历序列:BDAC北京林业大学信息学院StatusInOrderTraverse(BiTreeT){

if(T==NULL)returnOK;//非空二叉树

else{

InOrderTraverse(BiTreeT->lchild);

//递归遍历左子树

cout<<T->data;//访问根结点

InOrderTraverse(BiTreeT->rchild);

//递归遍历右子树

}}

中序遍历算法北京林业大学信息学院遍历的算法实现-后序遍历若二叉树为空,则空操作否则

后序遍历左子树(L)

后序遍历右子树(R)

访问根结点(D)ADBCLRDLRDLRDA>>D>>CLRDB后序遍历序列:DBCA北京林业大学信息学院StatusPostOrderTraverse(BiTreeT){

if(T==NULL)returnOK;//非空二叉树

else{

PostOrderTraverse(BiTreeT->lchild);

//递归遍历左子树

PostOrderTraverse(BiTreeT->rchild);

//递归遍历右子树

cout<<T->data;//访问根结点

}}

后序遍历算法北京林业大学信息学院StatusPreOrderTraverse(BiTreeT){

if(T==NULL)returnOK;else{

cout<<T->data;

PreOrderTraverse(BiTreeT->lchild);

PreOrderTraverse(BiTreeT->rchild);

}}

StatusPostOrderTraverse(BiTreeT){

if(T==NULL)returnOK;else{

PostOrderTraverse(BiTreeT->lchild);

PostOrderTraverse(BiTreeT->rchild);

cout<<T->data;}}

StatusInOrderTraverse(BiTreeT){

if(T==NULL)returnOK;else{

InOrderTraverse(BiTreeT->lchild);

cout<<T->data;

InOrderTraverse(BiTreeT->rchild);

}}

遍历算法的分析北京林业大学信息学院如果去掉输出语句,从递归的角度看,三种算法是完全相同的,或说这三种算法的访问路径是相同的,只是访问结点的时机不同。从虚线的出发点到终点的路径上,每个结点经过3次。AFEDCBG第1次经过时访问=先序遍历第2次经过时访问=中序遍历第3次经过时访问=后序遍历遍历算法的分析北京林业大学信息学院AFEDCBG时间效率:O(n)

//每个结点只访问一次空间效率:O(n)

//栈占用的最大辅助空间遍历算法的分析北京林业大学信息学院ABCDEFGA^B^C^D^E^F^^G^按先序遍历序列建立二叉树的二叉链表

例:已知先序序列为:

ABCDEGF(动态演示)二叉树的建立(算法6.4)北京林业大学信息学院计算二叉树结点总数计算二叉树叶子总数计算二叉树高度二叉树遍历算法的应用--实验3北京林业大学信息学院若二叉树中各结点的值均不相同,则:由二叉树的前序序列和中序序列,或由其后序序列和中序序列均能唯一地确定一棵二叉树,但由前序序列和后序序列却不一定能唯一地确定一棵二叉树。重要结论北京林业大学信息学院练习已知一棵二叉树的中序序列和后序序列分别是BDCEAFHG

DECBHGFA,请画出这棵二叉树。①由后序遍历特征,根结点必在后序序列尾部(A);②由中序遍历特征,根结点必在其中间,而且其左部必全部是左子树子孙(BDCE),其右部必全部是右子树子孙(FHG);③继而,根据后序中的DECB子树可确定B为A的左孩子,根据HGF子串可确定F为A的右孩子;以此类推。北京林业大学信息学院中序遍历:BDCEAFHG

后序遍历:DECBHGFA(BDCE)(FHG)ABF(DCE)(HG)CDEGHABBFF北京林业大学信息学院平衡树——排序树——判定树——带权树——最优树——特点:左右子树深度差≤1特点:“左小右大”例如,12个球只称3次分出轻重特点:路径长度带权值带权路径长度最短的树,又称Huffman树,用途之一是通信中的压缩编码。二叉树的应用6.6霍夫曼树北京林业大学信息学院6.4树和森林树的存储结构--二叉链表表示法typedef

struct

CSNode{

ElemTypedata;

struct

CSNode

*firstchild,*nextsibling;}CSNode,*CSTree;北京林业大学信息学院树的存储结构--二叉链表表示法北京林业大学信息学院

树二叉树

对应

存储

存储

解释

解释北京林业大学信息学院6.6霍夫曼树及其应用路径:路径长度:带权路径长度:树的带权路径长度:霍夫曼树:由一结点到另一结点间的分支所构成路径上的分支数目结点到根的路径长度与结点上权的乘积debacfg树中所有叶子结点的带权路径长度之和带权路径长度最小的树a→e的路径长度=2WPL=

wklk

k=1n北京林业大学信息学院dcab2475WPL=7*3+5*3+2*1+4*2=46abcd7524WPL=7*1+5*2+2*3+4*3=35abcd7524WPL=7*2+5*2+2*2+4*2=36权值分别为7,5,2,4,构造有4个叶子结点的二叉树北京林业大学信息学院a7b5c2d4a7b5c2d46a7b5c2d411a7b5c2d418a7b5c2d4霍夫曼树的构造过程操作要点:对权值的合并、删除与替换,总是合并当前值最小的两个基本思想:使权大的结点靠近根北京林业大学信息学院根据给定的n个权值{w1,w2,……wn},构造n棵只有根结点的二叉树。在森林中选取两棵根结点权值最小的树作左右子树,构造一棵新的二叉树,置新二叉树根结点权值为其左右子树根结点权值之和。在森林中删除这两棵树,同时将新得到的二叉树加入森林中。重复上述两步,直到只含一棵树为止,这棵树即霍夫曼树。霍夫曼树的构造过程北京林业大学信息学院Ch5_8.ctypedef

struct{int

weght;

int

parent,lch,rch;}*HuffmanTree;霍夫曼树构造算法的实现(算法6.12)采用顺序存储结构——一维结构数组结点类型定义一棵有n个叶子结点的Huffman树有

个结点2n-1北京林业大学信息学院1)初始化HT[1..2n-1]:

weight=0,lch=rch=parent=02)输入初始n个叶子结点:置HT[1..n]的weight值3)进行以下n-1次合并,依次产生HT[i],i=n+1..2n-1:

3.1)在HT[1..i-1]中选两个未被选过的weight最小的两个结点HT[s1]和HT[s2](从parent=0的结点中选)3.2)修改HT[s1]和HT[s2]的parent值:parent=i3.3)置HT[i]:weight=HT[s1].weight+HT[s2].weight,

lch=s1,rch=s2霍夫曼树构造算法的实现(算法6.12)北京林业大学信息学院lchweightrchparent12345670000000752400000000000000000lchweightrchparent12345670000300752460000004000055000is1=3,s2=4a7b5c2d4霍夫曼树构造算法的实现(算法6.12)北京林业大学信息学院lchweightrchparent123456700003207524611000004500655600is1=2,s2=5lchweightrchparent1234567000032175246111800004567655670is1=1,s2=61

2

3

4000111111北京林业大学信息学院在远程通讯中,要将待传字符转换成二进制的字符串,怎样编码才能使它们组成的报文在网络中传得最快?ABACCDA000110010101100000011010霍夫曼树应用实例--霍夫曼编码出现次数较多的字符采用尽可能短的编码北京林业大学信息学院关键:要设计长度不等的编码,则必须使任一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论