数据结构new第六章二叉树_第1页
数据结构new第六章二叉树_第2页
数据结构new第六章二叉树_第3页
数据结构new第六章二叉树_第4页
数据结构new第六章二叉树_第5页
已阅读5页,还剩93页未读 继续免费阅读

下载本文档

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

文档简介

6.1树的类型定义6.2二叉树的类型定义6.3

二叉树的存储结构6.4二叉树的遍历6.5线索二叉树6.6树和森林的表示方法6.7树和森林的遍历6.8哈夫曼树与哈夫曼编码第六章树和二叉树6.1树的类型定义

A

C

GT2D

HIT3J

M

BEL

KT1F例子:学校的行政关系、书的层次结构、人类的家族血缘关系等。结点间有明显的层次结构关系数据对象D:D是具有相同特性的数据元素的集合。

数据关系R:若D为空集,则称为空树。否则:(1)在D中存在唯一的称为根的数据元素root;

(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,2,…,Tm,其中每一棵子集本身又是一棵符合本定义的树,称为根root的子树。

基本操作:查找类

插入类删除类

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)//初始化置空树

插入类:CreateTree(&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棵子树树的表示树根T1T2T3(1)有确定的根;(2)树根和子树根之间为有向关系。有向树:有序树:子树之间存在确定的次序关系。无序树:子树之间不存在确定的次序关系。对比树型结构和线性结构的结构特点~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~线性结构树型结构第一个数据元素

(无前驱)

根结点

(无前驱)最后一个数据元素

(无后继)多个叶子结点

(无后继)其它数据元素(一个前驱、一个后继)其它数据元素(一个前驱、多个后继)基本术语结点:结点的度:树的度:叶子结点:分支结点:数据元素+若干指向子树的分支分支的个数树中所有结点的度的最大值度为零的结点度大于零的结点DHIJM(从根到结点的)路径:孩子结点、双亲结点兄弟结点、堂兄弟祖先结点、子孙结点结点的层次:树的深度:

由从根到该结点所经分支和结点构成ABCDEFGHIJMKL假设根结点的层次为1,第l层的结点的子树根结点的层次为l+1树中叶子结点所在的最大层次任何一棵非空树是一个二元组

Tree=(root,F)其中:root被称为根结点

F被称为子树森林森林:是m(m≥0)棵互不相交的树的集合ArootBCDEFGHIJMKLF6.2

二叉树的类型定义

二叉树或为空树,或是由一个根结点加上两棵分别称为左子树和右子树的、互不交的二叉树组成。ABCDEFGHK根结点左子树右子树二叉树的五种基本形态:N空树只含根结点NNNLRR右子树为空树L左子树为空树左右子树均不为空树

二叉树的主要基本操作:查找类插入类删除类

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());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≥1)用归纳法证明:

归纳基:

归纳假设:

归纳证明:i=1

层时,只有一个根结点:2i-1=20=1;假设对所有的j,1≤j

i,命题成立;二叉树上每个结点至多有两棵子树,则第i层的结点数=2i-2

2=2i-1

。423167891011121314155第三层上(i=3),有23-1=4个节点。第四层上(i=4),有24-1=8个节点。性质2:

深度为k的二叉树上至多含2k-1个结点(k≥1)。证明:

基于上一条性质,深度为k的二叉树上的结点数至多为

20+21+

+2k-1=2k-1

。423167891011121314155此树的深度k

=4,共有24-1=15个节点。

性质3:

对任何一棵二叉树,若它含有n0个叶子结点、n2个度为

2

的结点,则必存在关系式:n0=n2+1。证明:设二叉树上结点总数n=n0+n1+n2又二叉树上分支总数b=n1+2n2

而b=n-1=n0+n1+n2-1由此,n0=n2+1。423167891011121314155n0=8n2=7两类特殊的二叉树:满二叉树:指的是深度为k且含有2k-1个结点的二叉树。完全二叉树:树中所含的n个结点和满二叉树中编号为1至n的结点一一对应。123456789101112131415abcdefghij特点:每一层上都含有最大结点数。深度为K的满二叉树,结点个数为2k-1

性质4

具有n个结点的完全二叉树的深度为

log2n

+1。证明:设完全二叉树的深度为k则根据第二条性质得2k-1≤n<2k

k-1≤log2n<k因为k只能是整数,因此,k=log2n

+1。423167891011121314155性质5:若对含n个结点的完全二叉树从上到下且从左至右进行1

至n

的编号,则对完全二叉树中任意一个编号为i

的结点:

(1)若i=1,则该结点是二叉树的根,无双亲,否则,编号为

i/2

的结点为其双亲结点;

(2)若2i>n,则该结点无左孩子,

否则,编号为2i的结点为其左孩子结点;

(3)若2i+1>n,则该结点无右孩子结点,

否则,编号为2i+1的结点为其右孩子结点。423167891011125

完全二叉树6.3二叉树的存储结构二、二叉树的链式存储表示一、二叉树的顺序存储表示#defineMAX_TREE_SIZE100//二叉树的最大结点数typedefTElemTypeSqBiTree[MAX_TREE_SIZE];//0号单元存储根结点SqBiTreebt;一、二叉树的顺序存储表示用一组连续的存储单元存放二叉树的数据元素。结点在数组中的相对位置蕴含着结点之间的关系。二叉树顺序存储结构

bt[16]若父结点在数组中i下标处,其左孩子在2*i处,右孩子在2*i+1处。11ABcFED

●●●●●●●●●124

8

9105637121314152h-1=24-1=15用一组连续的存储单元存放二叉树的数据元素。结点在数组中的相对位置蕴含着结点之间的关系。0000FE000DC0BA15141312111098765432100一般二叉树必须按完全二叉树的形式存储,将造成存储的浪费。typedefTElemTypeSqBiTree[MAX_TREE_SIZE+1];//0号单元未用SqBiTreebt例如:ABCDEF

ABDCEF

0123456789101112131401326typedefTElemTypeSqBiTree[MAX_TREE_SIZE];//0号单元存储根结点二、二叉树的链式存储表示1.二叉链表2.三叉链表3.双亲链表4.线索链表ADEBCF

rootlchilddatarchild结点结构:1.二叉链表typedefstructBiTNode{//结点结构

TElemTypedata;structBiTNode*lchild,*rchild;//左右孩子指针}BiTNode,*BiTree;ADEBCF

root

2.三叉链表parent

lchilddatarchild结点结构:typedefstructTriTNode{//结点结构

TElemTypedata;structTriTNode*lchild,*rchild;//左右孩子指针

structTriTNode*parent;//双亲指针

}TriTNode,*TriTree;0123456dataparent结点结构:3.双亲链表LRTagLRRRLtypedefstruct

BPTNode

{//结点结构

TElemTypedata;

int

*parent;//指向双亲的指针

charLRTag;//左、右孩子标志域

}BPTNodetypedefstructBPTree{//树结构

BPTNodenodes[MAX_TREE_SIZE];

intnum_node;//结点数目

introot;//根结点的位置

}BPTree6.4二叉树的遍历一、问题的提出二、先左后右的遍历算法三、算法的递归描述四、中序遍历算法的非递归描述五、遍历算法的应用举例遍历:按某条搜索路线寻访树中每个结点且只被访问一次。一、问题的提出“访问”的含义可以很广,如:输出结点的信息等。查找某个结点,或对二叉树中全部结点进行某种处理,就需要遍历。

“遍历”是任何类型均有的操作,对线性结构而言,只有一条搜索路径(因为每个结点均只有一个后继),故不需要另加讨论。而二叉树是非线性结构,每个结点有两个后继,则存在如何遍历即按什么样的搜索路径遍历的问题。对“二叉树”而言,可以有三条搜索路径1.先上后下的按层次遍历;2.先左(子树)后右(子树)的遍历;3.先右(子树)后左(子树)的遍历。二、先左后右的遍历算法按先左后右的原则,一般使用三种遍历:先根遍历(DLR):

访问根结点,按先序遍历左子树,按先序遍历右子树。中根遍历(LDR):

按中序遍历左子树,访问根结点,按中序遍历右子树。后根遍历(LRD):

按后序遍历左子树,按后序遍历右子树,访问根结点。二叉树为空时,执行空操作,即空二叉树已遍历完。遍历算法例:先序遍历:DLR中序遍历:LDR后序遍历:LRDADBCT1T2T3DLRADLRDLR>B>>D>>CDLR以先序遍历DLR为例演示遍历过程ABDCBDACDBCA三、算法的递归描述voidPreorder(BiTreeT,void(*visit)(TElemTypee)){//

先序遍历二叉树

//初始条件:二叉树T存在,Visit是对结点操作的应用函数。修改算法6.1//操作结果:先序递归遍历T,对每个结点调用函数Visit一次且仅一次

if(T){//T不空

visit(T->data);

//先访问根结点.如printf(“%c”,T->data)

Preorder(T->lchild,visit);

//再先序遍历左子树

Preorder(T->rchild,visit);//最后先序遍历右子树

}}四、中序遍历算法的非递归描述voidInOrderTraverse1(BiTreeT,void(*Visit)(TElemType)){//采用二叉链表存储结构,Visit是对数据元素操作的应用函数。修改算法6.3//中序遍历二叉树T的非递归算法(利用栈),对每个数据元素调用函数VisitSqStackS;InitStack(S);//初始化栈Swhile(T||!StackEmpty(S))//当二叉树T不空或者栈不空

{if(T)//二叉树T不空

{//根指针进栈,遍历左子树

Push(S,T);//入栈根指针

T=T->lchild;//T指向其左孩子

}else//根指针退栈,访问根结点,遍历右子树

{Pop(S,T);//出栈根指针

Visit(T->data);//访问根结点

T=T->rchild;//T指向其右孩子

}}printf("\n");}T五、遍历算法的应用举例1、统计二叉树中叶子结点的个数

(先序遍历)2、求二叉树的深度(后序遍历)3、复制二叉树(后序遍历)4、建立二叉树的存储结构5、由遍历序列确定二叉树1、统计二叉树中叶子结点的个数算法基本思想:

先序(或中序或后序)遍历二叉树,在遍历过程中查找叶子结点,并计数。由此,需在遍历算法中增添一个“计数”的参数,并将算法中“访问结点”的操作改为:若是叶子,则计数器增1。void

CountLeaf

(BiTreeT,int&count){

if(T){

if((!T->lchild)&&(!T->rchild))count++;//对叶子结点计数

CountLeaf(T->lchild,count);

CountLeaf(T->rchild,count);}//if}//CountLeaf2、求二叉树的深度(后序遍历)算法基本思想:

从二叉树深度的定义可知,二叉树的深度应为其左、右子树深度的最大值加1。由此,需先分别求得左、右子树的深度,算法中“访问结点”的操作为:求得左、右子树深度的最大值,然后加1。int

Depth(BiTreeT){//返回二叉树的深度

if(!T)depthval=0;else{depthLeft=Depth(T->lchild);depthRight=Depth(T->rchild);

depthval=1+(depthLeft>depthRight?depthLeft:depthRight);

}

returndepthval;}3、复制二叉树其基本操作为:生成一个结点。根元素T左子树右子树根元素NEWT左子树右子树左子树右子树(后序遍历)BiTNode

*GetTreeNode(TElemTypeitem,

BiTNode

*lptr,BiTNode*rptr){

if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))

exit(1);

T->data=item;

T->lchild=lptr;T->rchild=rptr;

returnT;}

生成一个二叉树的结点(其数据域为item,左指针域为lptr,右指针域为rptr)BiTNode

*CopyTree(BiTNode*T){

if(!T)returnNULL;

if(T->lchild)

newlptr=CopyTree(T->lchild);//复制左子树

elsenewlptr=NULL;

if(T->rchild)

newrptr=CopyTree(T->rchild);//复制右子树

elsenewrptr=NULL;

newT=GetTreeNode(T->data,newlptr,newrptr);

returnnewT;}//CopyTreeABCDEFGHK^D^C^^B^H^^K^G^F^E^A例如:下列二叉树的复制过程如下:newT4、建立二叉树的存储结构不同的定义方法相应有不同的存储结构的建立算法

以字符串的形式根左子树右子树定义一棵二叉树例如:ABCD以空白字符“”表示A(B(,C(,)),D(,))空树只含一个根结点的二叉树A以字符串“A”表示以下列字符串表示AB

C

D

ABCD算法执行过程举例如下:ATBCD^^^^^scanf(&ch);//输入结点的值

if(ch=='')T=NULL;

else{T=(BiTree)malloc(sizeof(BiTNode));//生成根结点

if(!T)exit(OVERFLOW);T->data=ch;CreateBiTree(T->lchild);//递归构造左子树

CreateBiTree(T->rchild);//递归构造右子树}}voidCreateBiTree(BiTree&T){voidCreateBiTree(BiTree&T)//算法6.4:按先序次序输入二叉树中结点的值(字符型),构造二叉链表表示的二叉树T。

仅知二叉树的先序序列“abcdefg”

不能唯一确定一棵二叉树,5、由遍历序列确定二叉树

如果同时已知二叉树的中序序列“cbdaegf”,则会如何?

二叉树的先序序列二叉树的中序序列左子树左子树右子树右子树根根由二叉树的先序和中序序列确定二叉树abcdefgcbdaegf例如:aabbccddeeffggabcdefg^^^^^^^^先序序列中序序列6.5

线索二叉树

何谓线索二叉树?线索链表的遍历算法如何建立线索链表?一、何谓线索二叉树?遍历二叉树的结果是,求得结点的一个线性序列。ABCDEFGHK例如:先序序列:

ABCDEFGHK中序序列:

BDCAHGKFE后序序列:

DCBHKGFEA指向该线性序列中的“前驱”和“后继”的指针,称作“线索”与其相应的二叉树,称作“线索二叉树”包含“线索”的存储结构,称作“线索链表”ABCDEFGHK^D^

C^^B

E^意义:保存遍历二叉树后得到的线性序列,避免重复遍历。对线索链表中结点的约定:

在二叉链表的结点中增加两个标志域,规定如下:如此定义的二叉树的存储结构称作“线索链表”。左标志ltag:0表示lchild指向左孩子结点

1表示lchild指向前驱结点右标志rtag:0表示rchild指向右孩子结点

1表示rchild指向后继结点这样,每个结点的存储结构如下:LChildLtagDataRtagRChildtypedefstruct

BiThrNod{

TElemTypedata;

structBiThrNode*lchild,*rchild;//左右指针

PointerThrLTag,RTag;//左右标志}BiThrNode,*BiThrTree;线索链表的类型描述:

typedef

enum{

Link,Thread

}PointerThr;

//Link==0:指针,Thread==1:线索LChildLtagDataRtagRChild二、线索链表的遍历算法:由于在线索链表中添加了遍历中得到的“前驱”和“后继”的信息,从而简化了遍历的算法。例如:对中序线索化链表的遍历算法

※中序遍历的第一个结点?左子树上处于“最左下”(没有左子树)的结点。

※在中序线索化链表中结点的后继?若无右子树,则为后继线索所指结点;否则为对其右子树进行中序遍历时访问的第一个结点。LChildLtagDataRtagRChild二叉树voidInOrderTraverse_Thr(BiThrTreeT,void(*Visit)(TElemType))

{//中序遍历线索二叉树T(头结点)的非递归算法。算法6.5BiThrTreep;p=T->lchild;//p指向根结点

while(p!=T)

{

//空树或遍历结束时,p==T

while(p->LTag==Link)

//由根结点一直找到二叉树的最左结点

p=p->lchild;

//p指向其左孩子

Visit(p->data);//访问此结点

while(p->RTag==Thread&&p->rchild!=T)

{

//p->rchild是线索(后继),且不是遍历的最后一个结点

p=p->rchild;//p指向其后继

Visit(p->data);//访问后继结点

}

//若p->rchild不是线索(是右孩子),p指向右孩子,返回循环,找这棵子树中序遍历的第1个结点

p=p->rchild;

}}

typedef

enum{

Link,Thread

}PointerThr;

//Link==0:指针,Thread==1:线索LChildLtagDataRtagRChild

在中序遍历过程中修改结点的左、右指针域,以保存当前访问结点的“前驱”和“后继”信息。遍历过程中,附设指针pre,并始终保持指针pre指向刚刚访问过的结点,指针p指向当前访问的结点。即pre指向当前访问结点的前驱。三、如何建立线索链表?BiThrTreepre;//全局变量,始终指向刚刚访问过的结点

voidInThreading(BiThrTreep)

{//通过中序遍历进行中序线索化,线索化之后pre指向最后一个结点。算法6.7if(p)//线索二叉树不空

{InThreading(p->lchild);//递归左子树线索化

if(!p->lchild)//没有左孩子

{p->LTag=Thread;//左标志为线索(前驱)p->lchild=pre;//左孩子指针指向前驱

}if(!pre->rchild)//前驱没有右孩子

{pre->RTag=Thread;//前驱的右标志为线索(后继)pre->rchild=p;//前驱右孩子指针指向其后继(当前结点p)}pre=p;//保持pre指向p的前驱

InThreading(p->rchild);//递归右子树线索化

}}voidInOrderThreading(BiThrTree&Thrt,BiThrTreeT)

{//中序遍历二叉树T,并将其中序线索化,Thrt指向头结点。算法6.6

if(!(Thrt=(BiThrTree)malloc(sizeof(BiThrNode))))//生成头结点不成功

exit(OVERFLOW);Thrt->LTag=Link;//建头结点,左标志为指针

Thrt->RTag=Thread;//右标志为线索

Thrt->rchild=Thrt;//右孩子指针回指

if(!T)//若二叉树T空,则左孩子指针回指

Thrt->lchild=Thrt;

else

//二叉树T非空

{Thrt->lchild=T;//头结点的左孩子指针指向根结点

pre=Thrt;//pre(前驱)的初值指向头结点,全局变量

InThreading(T);

//中序遍历进行中序线索化,pre指向中序遍历的最后一个结点

pre->rchild=Thrt;//最后一个结点的右孩子指针指向头结点

pre->RTag=Thread;//最后一个结点的右标志为线索

Thrt->rchild=pre;//头结点的右孩子指针指向中序遍历的最后一个结点

}}

6.6树和森林的表示方法树的三种存储结构一、双亲表示法二、孩子链表表示法三、树的二叉链表(孩子-兄弟)存储表示法四、树、森林与二叉树的相互转换ABCDEFG0

A

-11

B

02

C

03

D

04

E

25

F

26

G

5r=0n=7dataparent一、双亲表示法:

typedefstructPTNode{Elemdata;

intparent;//双亲位置域

}PTNode;typedefstruct{PTNodenodes[MAX_TREE_SIZE];intr,n;//根结点的位置和结点个数

}PTree;结点结构:树结构:#defineMAX_TREE_SIZE100ABCDEFG0

A1

B

2

C

3

D

4

E

5

F

6

G

r=0n=7123456二、孩子链表表示法:parent

1000224datafirstchildABCDEFGABCEDFGrootABCEDFG

三、树的二叉链表(孩子-兄弟)存储表示法

firstchilddatanextsibling结点结构typedefstructCSNode{Elemdata;

structCSNode

*firstchild,*nextsibling;}CSNode,*CSTree;CSTreeroot四、树、森林与二叉树的相互转换1.树转换为二叉树由于二叉树可以用二叉链表表示,为了使一般树也能用二叉链表表示,必须找出树与二叉树之间的关系。这样,给定一棵树,可以找到唯一的一棵二叉树与之对应。(1)树中所有相邻兄弟之间加一条连线。(2)对树中的每个结点,只保留其与第一个孩子结点之间的连线,删去其与其它孩子结点之间的连线。(3)以树的根结点为轴心,将整棵树顺时针旋转一定的角度,使之结构层次分明。

I

A

B

C

DEF

G

H(b)

A

B

CDE

G

HFI(a)树转换为二叉树ABEFCDGHI(d)ABCDEFGHI(c)注意:树转换为二叉树后,根无右子树。树与二叉树的对应树的二叉链表(孩子-兄弟)存储表示法二叉树二叉链表存储表示法2.森林转换为二叉树

(1)将森林中的每棵树转换成相应的二叉树。(2)第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树根结点的右孩子,当所有二叉树连在一起后,所得到的二叉树就是由森林转换得到的二叉树。森林转换为二叉树的过程森林转换后的二叉树,其根结点有右孩子由森林转换成二叉树的转换规则为:若F=Φ,则B=Φ;否则,由ROOT(T1)

对应得到B的根

root;由(t11,t12,…,t1m1)

对应得到LB;由(T2,T3,…,Tm)

对应得到RB。设森林

F=(T1,T2,…,Tm);T1=(root,t11,t12,…,t1m1);二叉树

B=(root,LB,RB);由二叉树转换为森林的转换规则为:若B=Φ,则F=Φ;否则,由root

对应得到ROOT(T1

);由LB

对应得到T1中的子森林(t11,t12,…,t1m);由RB

对应得到(T2,T3,…,Tn)。

3.二叉树还原为树或森林(1)若某结点是其双亲的左孩子,则把该结点的右孩子、右孩子的右孩子……都与该结点的双亲结点用线连起来。(2)删掉原二叉树中所有双亲结点与右孩子结点的连线。(3)整理由(1)、(2)两步所得到的树或森林。二叉树到森林的转换示例

设二叉树

B=(root,LB,RB);森林

F=(T1,T2,…,Tm);

由此,树的各种操作均可对应二叉树的操作来完成。

应当注意的是,和树对应的二叉树,其左、右子树的概念已改变为:

左是孩子,右是兄弟。6.7树和森林的遍历一、树的遍历二、森林的遍历树的遍历可有三条搜索路径:按层次遍历:先根(次序)遍历:后根(次序)遍历:

若树不空,则先访问根结点,然后依次先根遍历各棵子树。

若树不空,则先依次后根遍历各棵子树,然后访问根结点。

若树不空,则自上而下自左至右访问树中每个结点。ABCDEFGHIJK

先根遍历时顶点的访问次序:ABEFCDGHIJK

后根遍历时顶点的访问次序:EFBCIJKHGDA

层次遍历时顶点的访问次序:ABCDEFGHIJK

BCDEFGHIJK1.森林中第一棵树的根结点;2.森林中第一棵树的子树森林;3.森林中其它树构成的森林。森林由三部分构成:1.先序遍历森林的遍历若森林不空,则访问森林中第一棵树的根结点;先序遍历森林中第一棵树的子树森林;先序遍历森林中(除第一棵树之外)其余树构成的森林。即:依次从左至右对森林中的每一棵树进行先根遍历。例如,P138图6.17中森林的先序遍历序列为ABCDEFGHIJ。2.中序遍历若森林不空,则中序遍历森林中第一棵树的子树森林;访问森林中第一棵树的根结点;中序遍历森林中(除第一棵树之外)其余树构成的森林。即:依次从左至右对森林中的每一棵树进行后根遍历。森林的遍历例如,P138图6.17中森林的中序遍历序列为BCDAFEHJIG。

树的遍历和二叉树遍历的对应关系?先根遍历后根遍历树二叉树森林先序遍历先序遍历中序遍历中序遍历6.8哈夫曼树与应用

最优树的定义

如何构造最优树哈夫曼树与应用

一、最优树的定义树的路径长度定义为:

树中每个结点的路径长度之和。

结点的路径长度定义为:

从根结点到该结点的路径上分支的数目。

树的带权路径长度定义为:

树中所有叶子结点的带权路径长度之和

WPL(T)=

wklk(对所有叶子结点)。

在所有含n个叶子结点、并带相同权值的m叉树中,必存在一棵其带权路径长度取最小值的树,称为“最优树”。例如:27975492WPL(T)=72+52+23+43+92=60WPL(T)=74+94+53+42+21

温馨提示

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

评论

0/150

提交评论