版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Powered by yuanmayingdiyisucaidw2f树树数据结构之四树树 树型结构是一类非常重要的树型结构是一类非常重要的非线性非线性结构结构 树型结构是以分支关系定义的层次结构。树型结构是以分支关系定义的层次结构。 树在计算机领域中也有着广泛的应用树在计算机领域中也有着广泛的应用例如在编译程序中,用树来表示源程序的语法结构;在数据库系例如在编译程序中,用树来表示源程序的语法结构;在数据库系统中,可用树来组织信息;在分析算法的行为时,可用树来描述统中,可用树来组织信息;在分析算法的行为时,可用树来描述其执行过程等等。其执行过程等等。7.1树的定义和基本术语1 1 树的定义树的定
2、义 树树(Tree)是是n(n0)个结点的有限集合个结点的有限集合T,若,若n=0时称为空树,否则:时称为空树,否则: 有且只有一个特殊的称为树的根有且只有一个特殊的称为树的根(Root)结点;结点; 若若n1时,其余的结点被分为时,其余的结点被分为m(m0)个个互不相交的子集的子集T1, T2, T3Tm,其中每个子集本身又,其中每个子集本身又是一棵树,称其为根的子树是一棵树,称其为根的子树(Subtree)。 这是树的递归定义,即用树来定义树,而只有这是树的递归定义,即用树来定义树,而只有一个结点的树必定仅由根组成,如图一个结点的树必定仅由根组成,如图6-1(a)所示。所示。树的定义和基本
3、术语2 树的基本术语 结点(node):一个数据元素及其若干指向其子树的分支。 结点的度(degree) 、树的度:结点所拥有的子树的棵数称为结点的度。树中结点度的最大值称为树的度。 图图6-1 树的示树的示例形式例形式AABDCEGFHIMJNKL(a) 只有根结点只有根结点(b) 一般的树一般的树如图如图6-1(b)中结点中结点A的度是的度是3 ,结点,结点B的度是的度是2 ,结点,结点M的度是的度是0,树的度是,树的度是3 。树的定义和基本术语 叶子(left)结点、非叶子结点:度为0的结点称为叶子结点(或终端结点)。相对应地,度不为0的结点称为非叶子结点(分支结点)。 如图6-1(b)
4、中结点H、I、J、K、L、M、N是叶子结点,而所有其它结点都是分支结点。 孩子结点、双亲结点、兄弟结点 如图如图6-1(b)中结点中结点B 、C、D是结点是结点A的子结点的子结点,而,而结点结点A是是结点结点B 、C、D的的父结点父结点;类似地结点类似地结点E 、F是是结点结点B的子结点的子结点,结点,结点B是是结点结点E 、F的的父父结点。结点。 同一双亲结点的所有子结点互称为同一双亲结点的所有子结点互称为兄弟结点兄弟结点。 如图如图6-1(b)中结点中结点B 、C、D是兄弟结点;结点是兄弟结点;结点E 、F是兄弟结点。是兄弟结点。树的定义和基本术语 层次 规定树中根结点的层次为1,其余结点
5、的层次等于其双亲结点的层次加1。 若某结点在第i(i1)层,则其子结点在第i+1层。 结点的层次路径、祖先、子孙 从根结点开始,到达某结点p所经过的所有结点成为结点p的层次路径(有且只有一条)。 结点p的层次路径上的所有结点(p除外)称为p的祖先(ancester) 。 以某一结点为根的子树中的任意结点称为该结点的子孙结点(descent)。 树的定义和基本术语 树的深度(depth):树中结点的最大层次值,又称为树的高度,如图6-1(b)中树的高度为4。 有序树和无序树:对于一棵树,若其中每一个结点的子树(若有)具有一定的次序,则该树称为有序树,否则称为无序树。 森林(forest):是m(
6、m0)棵互不相交的树的集合。显然,若将一棵树的根结点删除,剩余的子树就构成了森林。树的表示形式图图6-2 树的表示树的表示形式形式(c)嵌套集合嵌套集合形式形式(b) 广义表广义表形式形式(A(B(E(K,L),F),C(G(M,N),D(H,I,J)HIJDFBK LECM NGAABDCEGFHIMJNKL(a)倒悬树)倒悬树习习 题题 假设在树中,假设在树中, 结点结点x是结点是结点y的双亲时,用的双亲时,用(x,y)来来表示树边。已知一棵树的树边集合为表示树边。已知一棵树的树边集合为 (e,i), (b,e), (b,d), (a,b), (g,j), (c,g), (c,f), (h
7、,l), (c,h), (a,c) ,用树型表示,用树型表示法表示该树,并回答下列问题:法表示该树,并回答下列问题: 哪个是根结点哪个是根结点? 哪些是叶子结点哪些是叶子结点? 哪个是哪个是g的的双亲双亲? 哪些是哪些是g的祖先的祖先? 哪些是哪些是g的孩子的孩子? 那些是那些是e的子孙的子孙? 哪些是哪些是e的兄弟的兄弟? 哪些是哪些是f的兄弟的兄弟? b和和n的层次各是多少的层次各是多少? 树的深度是多少树的深度是多少? 以结以结点点c为根的子树的深度是多少为根的子树的深度是多少?7.2 二叉树二叉树1 1 二叉树的定义二叉树的定义 二叉树二叉树(Binary tree)(Binary t
8、ree)是是n(nn(n0)0)个个结点的有限集合。若结点的有限集合。若n=0n=0时称为空树,时称为空树,否则:否则: 有且只有一个特殊的称为树的根有且只有一个特殊的称为树的根(Root)(Root)结点;结点; 若若n1n1时,其余的结点被分成为时,其余的结点被分成为二个互不相交二个互不相交的子集的子集T T1 1,T,T2 2,分别称,分别称之为左、右子树,并且左、右子树之为左、右子树,并且左、右子树又都是二叉树。又都是二叉树。 由此可知,二叉树的由此可知,二叉树的定义是递归定义是递归的。的。二叉树二叉树 结构简单结构简单 存储效率高,存储效率高, 操作算法相对简单操作算法相对简单 任何
9、树都很容易转任何树都很容易转化成二叉树结构。化成二叉树结构。二叉树的基本形态二叉树的基本形态二叉树有二叉树有5种基本形态:种基本形态:AAAA(a)(b)(c)(d)(e)(a) 空空二叉树二叉树(b) 单结点单结点二叉树二叉树(c) 右子树为空右子树为空(d) 左子树为空左子树为空(e) 左左、右子树都不空右子树都不空6.2.2 二叉树的性质二叉树的性质性质1:在非空二叉树中,第i层上至多有2i-1个结点。性质2:深度为k的二叉树至多有2k-1个结点(k1) 。性质3:对任何一棵二叉树,若其叶子结点数为n0,度为2的结点数为n2,则n0=n2+1。6.2.36.2.3满二叉树和完全二叉树满二
10、叉树和完全二叉树 一棵深度为k且有2k-1个结点的二叉树称为满二叉树(Full Binary Tree)。894101151213614157213(a) 满二叉树满二叉树满二叉树的特点:满二叉树的特点: 基本特点是每一层上的基本特点是每一层上的结点数总是最大结点数。结点数总是最大结点数。 满二叉树的所有的支结满二叉树的所有的支结点都有左点都有左、右子树。右子树。 可对满二叉树的结点进可对满二叉树的结点进行连续编号,若规定从根结行连续编号,若规定从根结点开始,按点开始,按“自上而下自上而下、自自左至右左至右”的原则进行。的原则进行。6.2.36.2.3满二叉树和完全二叉树满二叉树和完全二叉树
11、完全二叉树(Complete Binary Tree):如果深度为k,由n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1到n的结点一一对应,该二叉树称为完全二叉树。894101152112673(b) 完全二叉树完全二叉树1362455674213(c) 非完全二叉树非完全二叉树完全二叉树是满二叉树的一部分完全二叉树是满二叉树的一部分满二叉树是完全二叉树的特例。满二叉树是完全二叉树的特例。完全二叉树的特点完全二叉树的特点 若完全二叉树的深度为若完全二叉树的深度为k ,则所有的叶子结点都出现在第,则所有的叶子结点都出现在第k k层或层或k-1层。对于任一结点,如果其右子树的
12、最大层次为层。对于任一结点,如果其右子树的最大层次为l,则其左子树的最大层次为,则其左子树的最大层次为l或或l+1 1。 性质4:n个结点的完全二叉树深度为: 2n +1。 其中符号:其中符号: x 表示不大于表示不大于x的最大整数。的最大整数。 x 表示不小于表示不小于x的最小整数。的最小整数。完全二叉树的特点完全二叉树的特点 性质5:若对一棵有n个结点的完全二叉树(深度为2n+1)的结点按层(从第1层到第2n +1层)序自左至右进行编号,则对于编号为i(1in)的结点: 若i=1:则结点i是二叉树的根,无双亲结点;否则,若i1,则其双亲结点编号是 i/2 。 如果2in:则结点i为叶子结点
13、,无左孩子;否则,其左孩子结点编号是2i。 如果2i+1n:则结点i无右孩子;否则,其右孩子结点编号是2i+1。6.2.4 二叉树的存储结构二叉树的存储结构1 顺序存储结构顺序存储结构 二叉树存储结构的类型定义:二叉树存储结构的类型定义:#define MAX 100sqbitreeMAX; 用一组地址连续的存储单元依次用一组地址连续的存储单元依次“自上而下自上而下、自左自左至右至右”存储完全二叉树的数据元素。存储完全二叉树的数据元素。 对于完全二叉树上编号为对于完全二叉树上编号为i的结点元素存储在一维的结点元素存储在一维数组的下标值为数组的下标值为i-1的分量中的分量中,如图,如图6-6(c
14、)所示。所示。 对于一般的二叉树,将其每个结点与完全二叉树上对于一般的二叉树,将其每个结点与完全二叉树上的结点相对照,的结点相对照,存储在一维数组中存储在一维数组中,如图,如图6-6(d)所示。所示。abcdhiejklfg(a) 完全二叉树完全二叉树(b) 非完全二叉树非完全二叉树abcdefgh1 2 3 4 5 6 7 8 9 10 11 12 a b c d e f g h i j k l (c) 完全二叉树的顺序存储形式完全二叉树的顺序存储形式1 2 3 4 5 6 7 8 9 10 11a b c d e h f g(d) 非完全二叉树的顺序存储形式非完全二叉树的顺序存储形式图图6
15、-6 二叉二叉树及其树及其顺序存储形式顺序存储形式最坏的情况下,最坏的情况下,一个深度为一个深度为k且且只有只有k个结点的个结点的单支树需要长度单支树需要长度为为2k-1的一维数的一维数组组。设计不同的结点结构可构成不同的链式存储结构。设计不同的结点结构可构成不同的链式存储结构。(1) 结点的类型及其定义结点的类型及其定义 二叉链表结点二叉链表结点。有三个域:一个数据域,两个分。有三个域:一个数据域,两个分别指向左右子结点的指针域,如图别指向左右子结点的指针域,如图6-7(a)所示。所示。 struct BTNode int data ; BTNode *Lchild , *Rchild ;
16、2 链式存储结构链式存储结构 三三叉链表结点叉链表结点。除二叉链表的三个域外,再增加一。除二叉链表的三个域外,再增加一个指针域,用来指向结点的父结点,如图个指针域,用来指向结点的父结点,如图6-7(b)所示。所示。struct BTNode_3 int data ; BTNode_3 *Lchild , *Rchild , *parent ; Lchild data RchildLchild data parent Rchild(a) 二叉链表结点二叉链表结点(b) 三三叉链表结点叉链表结点图图6-7 链表结点结构链表结点结构形式形式例有一棵一般的二叉树,如图例有一棵一般的二叉树,如图 (a)
17、所示。以二叉链表和三所示。以二叉链表和三叉链表方式存储的结构图分别如图叉链表方式存储的结构图分别如图 (b) 、 (c)所示。所示。图图6-8 二叉树及其二叉树及其链式存储结构链式存储结构(a) 二叉树二叉树afedcbg(c) 三三叉链表叉链表 a b c d e f g T(b) 二二叉链表叉链表 a b c d e g f T(2) 二叉树的链式存储形式二叉树的链式存储形式6.3 遍历二叉树及其应用遍历二叉树及其应用遍历二叉树遍历二叉树(Traversing Binary Tree):是指是指按指按指定的规律定的规律对二叉树中的对二叉树中的每个结点访问一次且仅访问一次每个结点访问一次且仅
18、访问一次。 所谓所谓访问访问是指对结点做某种处理。如:输出信息是指对结点做某种处理。如:输出信息、修改结点的值等修改结点的值等。 二叉树是一种非线性结构,每个结点都可能有左二叉树是一种非线性结构,每个结点都可能有左、右两棵子树,因此,需要寻找一种规律,使二叉树上的右两棵子树,因此,需要寻找一种规律,使二叉树上的结点能排列在一个线性队列上,从而便于遍历。结点能排列在一个线性队列上,从而便于遍历。 二叉树的基本组成:根结点二叉树的基本组成:根结点、左子树左子树、右子树。若右子树。若能依次遍历这三部分,就是遍历了二叉树。能依次遍历这三部分,就是遍历了二叉树。 若以若以L、D、R分别表示遍历左子树、遍
19、历根结点和分别表示遍历左子树、遍历根结点和遍历右子树,遍历右子树,则有六种遍历方案:则有六种遍历方案:DLR、LDR、LRD、DRL、RDL、RLD。若规定若规定先左后右先左后右,则只有,则只有前三种前三种情况情况三种情况,分别是:三种情况,分别是:DLR先先( (根根) )序遍历。序遍历。LDR中中( (根根) )序遍历。序遍历。LRD后后( (根根) )序遍历。序遍历。 对于二叉树的遍历,递归遍历算法具有非常清晰的对于二叉树的遍历,递归遍历算法具有非常清晰的结构。实际上,递归算法是由系统通过使用堆栈来实现结构。实际上,递归算法是由系统通过使用堆栈来实现控制的。控制的。6.3.1 先序遍历二
20、叉树先序遍历二叉树1 递归算法递归算法算法的递归定义是:算法的递归定义是: 若二叉树为空,则遍历结束;否则若二叉树为空,则遍历结束;否则 访问根结点;访问根结点; 先序遍历左子树先序遍历左子树(递归调用本算法递归调用本算法); 先序遍历右子树先序遍历右子树(递归调用本算法递归调用本算法)。void PreorderTraverse(BTNode *T) if (T!=NULL) coutdata ; /* 访问根结点访问根结点 */PreorderTraverse(T-Lchild) ;PreorderTraverse(T-Rchild) ; 说明:说明:树采用二叉链表的存储结构,用指针变量树
21、采用二叉链表的存储结构,用指针变量T T来指来指向。向。先序遍历的递归算法(a) 二叉树二叉树afedcbg先序遍历的结果?abcdegf 中序遍历二叉树1 递归算法递归算法算法的递归定义是:算法的递归定义是: 若二叉树为空,则遍历结束;否则若二叉树为空,则遍历结束;否则 中序遍历左子树中序遍历左子树(递归调用本算法递归调用本算法); 访问根结点;访问根结点; 中序遍历右子树中序遍历右子树(递归调用本算法递归调用本算法)。void InorderTraverse(BTNode *T) if (T!=NULL) InorderTraverse(T-Lchild) ;coutdata ; /* 访
22、问根结点访问根结点 */InorderTraverse(T-Rchild) ;中序遍历的递归算法中序遍历的递归算法(a) 二叉树二叉树afedcbg中序遍历的结果?cbegdfa 6.3.3 后序遍历二叉树后序遍历二叉树1 递归算法递归算法算法的递归定义是:算法的递归定义是: 若二叉树为空,则遍历结束;否则若二叉树为空,则遍历结束;否则 后序遍历左子树后序遍历左子树(递归调用本算法递归调用本算法); 后序遍历右子树后序遍历右子树(递归调用本算法递归调用本算法) ; 访问根结点访问根结点 。void PostorderTraverse(BTNode *T) if (T!=NULL) Postor
23、derTraverse(T-Lchild) ;PostorderTraverse(T-Rchild) ; coutdata) ; /* 访问根结点访问根结点 */ 无论是哪种次序的遍历,对有无论是哪种次序的遍历,对有n个结点的二叉树,其时个结点的二叉树,其时间复杂度均为间复杂度均为O(n) 。后序遍历的递归算法后序遍历的递归算法(a) 二叉树二叉树afedcbg后序遍历的结果?cgefdba 如图如图6-9所示的二叉树表示表达式:所示的二叉树表示表达式:(a+b*(c-d)-e/f)按不同的次序遍历此二叉树,将访问的结点按先后次序按不同的次序遍历此二叉树,将访问的结点按先后次序排列起来的次序是
24、:排列起来的次序是:/fe-dcb*a+图图6-9表达式表达式 (a+b*(c-d)-e/f)二叉树二叉树其先序序列为:其先序序列为: -+a*b-cd/ef其中序序列为:其中序序列为: a+b*c-d-e/f其后序序列为:其后序序列为: abcd-*+ef/-6.3.4 层次遍历二叉树层次遍历二叉树 层次遍历二叉树,是从根结点开始遍历,按层次次层次遍历二叉树,是从根结点开始遍历,按层次次序序“自上而下自上而下,从左至右从左至右”访问树中的各结点。访问树中的各结点。 为保证是按层次遍历,必须设置一个队列。为保证是按层次遍历,必须设置一个队列。 设设T是指向根结点的指针变量,层次遍历非递归算是指
25、向根结点的指针变量,层次遍历非递归算法是:法是:若二叉树为空,则返回;否则,令若二叉树为空,则返回;否则,令p=T,p入队;入队; 队首元素出队到队首元素出队到p;访问访问p所指向的结点;所指向的结点; 将将p所指向的结点的左、右子结点依次入队。直所指向的结点的左、右子结点依次入队。直到队空为止。到队空为止。#define MAX 50void LevelorderTraverse( BTNode *T) BTNode *QueueMAX_NODE ,*p=T ;int front=0 , rear=0 ;if (p!=NULL) Queue+rear=p; /* 根结点入队根结点入队 */w
26、hile (frontdata ); if (p-Lchild!=NULL) Queue+rear=p; /* 左结点入队左结点入队 */ if (p-Rchild!=NULL) Queue+rear=p; /* 左结点入队左结点入队 */ (1 1) 设有如图设有如图6-27所示的二叉树。所示的二叉树。 分别用顺序存储方法和链接存储方法画出该二分别用顺序存储方法和链接存储方法画出该二叉树的存储结构。叉树的存储结构。 写出该二叉树的先序、中序、后序遍历序列。写出该二叉树的先序、中序、后序遍历序列。(2 2)已知一棵二叉树的先序遍历序列和中序遍历序)已知一棵二叉树的先序遍历序列和中序遍历序列分别
27、为列分别为ABDGHCEFI和和GDHBAECIF,请画出这棵二,请画出这棵二叉树,然后给出该树的后序遍历序列。叉树,然后给出该树的后序遍历序列。(3 3) 设一棵二叉树的中序遍历序设一棵二叉树的中序遍历序列和后序遍历序列分别为列和后序遍历序列分别为BDCEAFHG和和DECBHGFA ,请,请画出这棵二叉树,然后给出该树的先画出这棵二叉树,然后给出该树的先序序列。序序列。图图6-27 二叉树二叉树adebfgchkmn6.5 树与森林树与森林 本节将讨论树的存储结构、树及森林与二叉树之间本节将讨论树的存储结构、树及森林与二叉树之间的相互转换、树的遍历等。的相互转换、树的遍历等。6.5.1 树
28、的存储结构树的存储结构 树的存储结构根据应用的不同而不同树的存储结构根据应用的不同而不同。1 双亲表示法双亲表示法(顺序存储结构顺序存储结构) 用一组连续的存储空间来存储树的结点用一组连续的存储空间来存储树的结点,同时在同时在每个结点中附加一个每个结点中附加一个指示器指示器(整数域整数域) ,用以指示双亲结用以指示双亲结点的位置点的位置(下标值下标值) 。数组元素及数组的类型定义如下。数组元素及数组的类型定义如下:#define MAX 100struct PTNode int data ;int parent ;Struct Ptree PTNode NodesMAX ;int root;
29、/* 根结点位置根结点位置 */int num ; /* 结点数结点数 */ ; 图图6-13所示是一棵树及其双亲所示是一棵树及其双亲表示的存储结构表示的存储结构。这种存储结构利这种存储结构利用了任一结点的父结点唯一的性质用了任一结点的父结点唯一的性质。可以方便地直接找到可以方便地直接找到任一结点的父任一结点的父结点结点,但求结点的子结点时需要扫但求结点的子结点时需要扫描整个数组描整个数组。FGHIRABCDE图图6-13 树的双亲存储结构树的双亲存储结构R -10A 01B 02C 03D 14E 15F 36G 67H 68I 692 孩子链表表示法孩子链表表示法 树中每个结点有多个指针域
30、,每个指针指向其一棵树中每个结点有多个指针域,每个指针指向其一棵子树的根结点子树的根结点。有。有两种结点结构两种结点结构。 定长结点结构定长结点结构 指针域的数目就是树的度指针域的数目就是树的度。 其特点是其特点是:链表结构简单,但指针域的浪费明显:链表结构简单,但指针域的浪费明显。结点结构如图结点结构如图6-14(a) 所示所示。在一棵有在一棵有n个结点,度为个结点,度为k的树中必有的树中必有n(k-1)+1空指针域空指针域。 不定长结点结构不定长结点结构 树中每个结点的指针域数量不同,是该结点的度,树中每个结点的指针域数量不同,是该结点的度,如图如图6-14(b) 所示。没有多余的指针域,
31、但操作不便。所示。没有多余的指针域,但操作不便。图图6-14 孩子表示法的结点结构孩子表示法的结点结构data child1 child2 childn(a) 定长结点结构定长结点结构(b) 不不定长结点结构定长结点结构data k child1 child2 childk 复合链表结构复合链表结构 对于树中的每个结点,其孩子结点用带头结点的对于树中的每个结点,其孩子结点用带头结点的单链表表示,表结点和头结点的结构如图单链表表示,表结点和头结点的结构如图6-15所示所示。 n个结点的树有个结点的树有n个个(孩子孩子)单链表单链表(叶子结点的孩子链叶子结点的孩子链表为空表为空),而,而n个头结点
32、又组成一个线性表且以顺序存储个头结点又组成一个线性表且以顺序存储结构表示结构表示。data firstchild(a) 头结点头结点childno next(b) 表结点表结点图图6-15 孩子链表结点结构孩子链表结点结构数据结构类型定义如下:数据结构类型定义如下:#define MAX 100struct listnode int childno ; /* 孩子结点编号孩子结点编号 */listno *next ;CTNode; /* 表结点结构表结点结构 */struct int data ;CTNode *firstchild ;HNode; /* 头结点结构头结点结构 */struct
33、 HNode nodesMAX ;int root; /* 根结点位置根结点位置 */int num ; /* 结点数结点数 */CLinkList; /* 头结点结构头结点结构 */ 图图6-13所示的树所示的树T的孩子链表表示的存储结构如图的孩子链表表示的存储结构如图6-16所示。所示。CLinkListnodes789 35 012 6 0123456789MAX_NODE-1rootnumA B C D E F G H I R 49图图6-16 图图6-13的树的树T的孩子链表存储结构的孩子链表存储结构3 孩子兄弟表示法孩子兄弟表示法(二叉树表示法二叉树表示法)以二叉链表作为树的存储结
34、构,其结点形式如图以二叉链表作为树的存储结构,其结点形式如图6-17(a)所示所示。 两个指针域:分别指向结点的第一个子结点和下一两个指针域:分别指向结点的第一个子结点和下一个兄弟结点。结点类型定义如下:个兄弟结点。结点类型定义如下:struct CSnode int data ;CSnode *firstchild, *nextsibing ; 图图6-17(b)所示树的孩子兄弟表示的存储结构如图所示树的孩子兄弟表示的存储结构如图6-17(c)。图图6-17 树及孩子兄弟存储结构树及孩子兄弟存储结构(b) 树树 FGRABCDE(c) 孩子兄弟存储结构孩子兄弟存储结构 R A D C G B
35、 F E 孩子结点孩子结点兄弟结点兄弟结点firstchild data nextsibing(a) 结点结构结点结构6.5.2 森林与二叉树的转换森林与二叉树的转换 由于二叉树和树都可用二叉链表作为存储结构,由于二叉树和树都可用二叉链表作为存储结构,对比各自的结点结构可以看出,以二叉链表作为媒介可对比各自的结点结构可以看出,以二叉链表作为媒介可以导出树和二叉树之间的一个对应关系。以导出树和二叉树之间的一个对应关系。 从物理结构来看,树和二叉树的二叉链表是相同从物理结构来看,树和二叉树的二叉链表是相同的,只是对指针的逻辑解释不同而已。的,只是对指针的逻辑解释不同而已。 从树的二叉链表表示的定义
36、可知,任何一棵和树从树的二叉链表表示的定义可知,任何一棵和树对应的二叉树,其右子树一定为空。对应的二叉树,其右子树一定为空。 图图6-18直观地展示了树和二叉树之间的对应关系。直观地展示了树和二叉树之间的对应关系。图图6-18 树与二叉树的对应关系树与二叉树的对应关系二叉树二叉树 CERADB R A D C B E 树树 RABCDE对应关系对应关系 R A D C B E C B E R A D 存储存储解释解释存储存储解释解释1 树转换成二叉树树转换成二叉树 对于一般的树,可以方便地转换成一棵唯一的二对于一般的树,可以方便地转换成一棵唯一的二叉树与之对应。将树转换成二叉树在叉树与之对应。
37、将树转换成二叉树在“孩子兄弟表示法孩子兄弟表示法”中已给出,其详细步骤是:中已给出,其详细步骤是: 加虚线加虚线。在树的每层按从。在树的每层按从“左至右左至右”的顺序在兄的顺序在兄弟结点之间加虚线相连。弟结点之间加虚线相连。 去连线去连线。除最左的第一个子结点外,父结点与所。除最左的第一个子结点外,父结点与所有其它子结点的连线都去掉。有其它子结点的连线都去掉。 旋转旋转。将树顺时针旋转。将树顺时针旋转450,原有的实线左斜。,原有的实线左斜。 整型整型。将旋转后树中的所有虚线改为实线,并向。将旋转后树中的所有虚线改为实线,并向右斜。该转换过程如图右斜。该转换过程如图6-19所示。所示。 这样转
38、换后的二叉树的特点是这样转换后的二叉树的特点是: 二叉树的二叉树的根结点没有右子树根结点没有右子树,只有左,只有左子树;子树; 左子结点仍然是原来树中相应结点的左子结点仍然是原来树中相应结点的左子结点,而所有沿右链往下的右子结点左子结点,而所有沿右链往下的右子结点均是原来树中该结点的兄弟结点。均是原来树中该结点的兄弟结点。图图6-19 树向二叉树的转换过程树向二叉树的转换过程(a) 一般的树一般的树 FGRABCDEFGRABCDE(b) 加虚线加虚线,去连线后去连线后 (C) 转换后的二叉树转换后的二叉树FGRACDBE2 二叉树转换成树二叉树转换成树 对于一棵转换后的二叉树,如何还原成原来
39、的树对于一棵转换后的二叉树,如何还原成原来的树? 其步骤是:其步骤是: 加虚线加虚线。若某结点。若某结点i是其父结点的左子树的根结是其父结点的左子树的根结点,则将该结点点,则将该结点i的右子结点以及沿右子链不断地搜的右子结点以及沿右子链不断地搜索所有的右子结点,将所有这些右子结点与索所有的右子结点,将所有这些右子结点与i结点的结点的父结点之间加虚线相连,父结点之间加虚线相连,如图如图6-20(a)所示所示。 去连线去连线。去掉二叉树中所有父结点与其右子结点。去掉二叉树中所有父结点与其右子结点之间的连线,之间的连线,如图如图6-20(b)所示所示。 规整化规整化。将图中各结点按层次排列且将所有的
40、虚。将图中各结点按层次排列且将所有的虚线变成实线,线变成实线,如图如图6-20(c)所示。所示。图图6-20 二叉树向树的转换过程二叉树向树的转换过程(C) 还原后的树还原后的树FGRABCDE(b) 去连线后去连线后 (a) 加虚线后加虚线后 FGRACDBECFGRADBE3 森林转换成二叉树森林转换成二叉树 当一般的树转换成二叉树后,二叉树的右子树必当一般的树转换成二叉树后,二叉树的右子树必为空为空。若把森林中的第二棵树。若把森林中的第二棵树( (转换成二叉树后转换成二叉树后) )的根结的根结点作为第一棵树点作为第一棵树(二叉树二叉树)的根结点的兄弟结点,则可导的根结点的兄弟结点,则可导
41、出森林转换成二叉树的转换算法如下:出森林转换成二叉树的转换算法如下: 设设F=T1, T2, ,Tn是森林,则按以下规则可转换成是森林,则按以下规则可转换成一棵二叉树一棵二叉树B=(root,LB,RB) 若若n=0,则,则B是空树是空树。 若若n0,则二叉树,则二叉树B的根是森林的根是森林T1的根的根root(T1),B的左子树的左子树LB是是B(T11,T12, ,T1m) ,其中,其中T11,T12, ,T1m是是T1的子树的子树(转换后转换后),而其右子树,而其右子树RB是从森是从森林林F=T2, T3, ,Tn转换而成的二叉树转换而成的二叉树。转换步骤转换步骤: 将将F=T1, T2
42、, ,Tn 中的每棵树转换成二叉树中的每棵树转换成二叉树。 按给出的森林中树的次序,从最后一棵二叉树开按给出的森林中树的次序,从最后一棵二叉树开始,每棵二叉树作为前一棵二叉树的根结点的右子始,每棵二叉树作为前一棵二叉树的根结点的右子树,依次类推,则第一棵树的根结点就是转换后生树,依次类推,则第一棵树的根结点就是转换后生成的二叉树的根结点,成的二叉树的根结点,如图如图6-21所示所示。ACBDGMLHK(a) 森林森林图图6-21 森林转换成二叉树的过程森林转换成二叉树的过程(b) 森林中每棵树森林中每棵树 对应的二叉树对应的二叉树ABCDGLKHM(c) 森林对应的二叉树森林对应的二叉树ABC
43、DGLKHM4 二叉树转换成森林二叉树转换成森林 若若B=(root,LB,RB)是一棵二叉树,则可以将其是一棵二叉树,则可以将其转换成由若干棵树构成的森林:转换成由若干棵树构成的森林:F=T1, T2, ,Tn 。转换算法转换算法: 若若B是空树,则是空树,则F为空为空。 若若B非空,则非空,则F中第一棵树中第一棵树T1的根的根root(T1)就是二就是二叉树的根叉树的根root, T1中根结点的子森林中根结点的子森林F1是由树是由树B的左的左子树子树LB转换而成的森林转换而成的森林;F中除中除T1外其余树组成的外其余树组成的的森林的森林F=T2, T3, ,Tn 是由是由B右子树右子树RB
44、转换得到的转换得到的森林森林。 上述转换规则是递归的上述转换规则是递归的,可以写出其递归算法。以可以写出其递归算法。以下给出具体的还原步骤。下给出具体的还原步骤。 去连线去连线。将二叉树。将二叉树B的根结点与其右子结点以及的根结点与其右子结点以及沿右子结点链方向的所有右子结点的连线全部去掉,沿右子结点链方向的所有右子结点的连线全部去掉,得到若干棵孤立的二叉树,每一棵就是原来森林得到若干棵孤立的二叉树,每一棵就是原来森林F中中的树依次对应的二叉树,的树依次对应的二叉树,如图如图6-22(b)所示所示。 二叉树的还原二叉树的还原。将各棵孤立的二叉树按二叉树还。将各棵孤立的二叉树按二叉树还原为树的方
45、法还原成一般的树,原为树的方法还原成一般的树,如图如图6- 22(c)所示所示。图图6-22 二叉树还原成森林的过程二叉树还原成森林的过程ACBDMGLHK(c) 还原成森林还原成森林(a) 二叉树二叉树ABCDGLKHM(b) 去连线后去连线后ABCDMGLKH6.5.3 树和森林的遍历树和森林的遍历1 树的遍历树的遍历 由树结构的定义可知,树的遍历有二种方法。由树结构的定义可知,树的遍历有二种方法。 先序遍历先序遍历:先访问根结点,然后:先访问根结点,然后依次先序遍历依次先序遍历完完每棵子树。每棵子树。如图如图6-23的树,先序遍历的次序是的树,先序遍历的次序是:ABDCKGJIFHE图图
46、6-23 树树ABCDEFGIJHK6.5.3 树和森林的遍历树和森林的遍历1 树的遍历树的遍历 后序遍历后序遍历:先:先依次后序遍历完依次后序遍历完每棵子树,然后访每棵子树,然后访问根结点。问根结点。如图如图6-23的树,后序遍历的次序是的树,后序遍历的次序是:ABDCKGJIFHE图图6-23 树树CDBFGIJHEKA说明说明: 树的树的先序遍历先序遍历实质上与将树转换成二实质上与将树转换成二叉树后对二叉树的叉树后对二叉树的先序遍历先序遍历相同。相同。 树的树的后序遍历后序遍历实质上与将树转换成二实质上与将树转换成二叉树后对二叉树的叉树后对二叉树的中序遍历中序遍历相同。相同。2 森林的遍
47、历森林的遍历 设设F=T1, T2, ,Tn是森林,对是森林,对F的遍历有二种方法。的遍历有二种方法。 先序遍历先序遍历:按:按先序遍历先序遍历树的方式树的方式依次依次遍历遍历F中的中的每棵树。每棵树。 中序遍历中序遍历:按:按后序遍历后序遍历树的方式树的方式依次依次遍历遍历F中的中的每棵树。每棵树。6.6 赫夫曼树及其应用赫夫曼树及其应用 赫夫曼赫夫曼(Huffman)树又称最优树,是一类带权路径树又称最优树,是一类带权路径长度最短的树,有着广泛的应用。长度最短的树,有着广泛的应用。6.6.1 最优二叉树最优二叉树(Huffman树树)1 基本概念基本概念 结点路径结点路径:从树中一个结点到
48、另一个结点的之间的分:从树中一个结点到另一个结点的之间的分支构成这两个结点之间的路径。支构成这两个结点之间的路径。 路径长度路径长度:结点路径上的分支数目称为路径长度:结点路径上的分支数目称为路径长度。 树的路径长度树的路径长度:从树根到每一个结点的路径长度之和:从树根到每一个结点的路径长度之和。ABDCKGJIFHE图图6-23 树树例图例图6-23的树的树。A到到F :结点路径:结点路径 AEF ;路径长度路径长度( (即边的数目即边的数目) ) 2 ;树的路径长度:树的路径长度:3 3 1+5 2+2 3=19 结点的带权路径长度结点的带权路径长度:从该结点的到树的根结点:从该结点的到树
49、的根结点之间的路径长度与结点的权之间的路径长度与结点的权( (值值) )的乘积的乘积。权权( (值值) ):各种:各种开销开销、代价代价、频度频度等的抽象称呼等的抽象称呼。 树的带权路径长度树的带权路径长度:树中:树中所有叶子结点所有叶子结点的带权路的带权路径长度之和,记做:径长度之和,记做: WPL=w1 l1+w2 l2+ +wn ln=wi li (i=1,2, ,n)其中:其中:n为叶子结点的个数为叶子结点的个数;wi为第为第i个结点的权值个结点的权值; li为第为第i个结点的路径长度。个结点的路径长度。 Huffman树树:具有:具有n个叶子结点个叶子结点(每个结点的权值每个结点的权
50、值为为wi) 的二叉树不止一棵,但在所有的这些二叉树中,的二叉树不止一棵,但在所有的这些二叉树中,必定存在一棵必定存在一棵WPL值最小值最小的树,称这棵树为的树,称这棵树为Huffman树树(或称最优树或称最优树) 。 在许多判定问题时,利用在许多判定问题时,利用Huffman树可以得到最佳判断算法。树可以得到最佳判断算法。 如图如图6-24是权值分别为是权值分别为2、3、6、7,具有,具有4个叶子结点的二个叶子结点的二叉树,它们的带权路径长度分别为叉树,它们的带权路径长度分别为:(a) WPL=2 2+3 2+6 2+7 2=36 ;(b) WPL=2 1+3 2+6 3+7 3=47 ;(
51、c) WPL=7 1+6 2+2 3+3 3=34 。 其中其中(c)的的 WPL值最小,可以证明是值最小,可以证明是Huffman树。树。236736726723(a)(b)(c)图图6-24 具有相同叶子结点,不同带权路径长度的二叉树具有相同叶子结点,不同带权路径长度的二叉树2 Huffman树的构造树的构造 根据根据n个权值个权值w1, w2, ,wn,构造成,构造成n棵二叉树棵二叉树的集合的集合F=T1, T2, ,Tn,其中每棵二叉树只有一个,其中每棵二叉树只有一个权值为权值为wi的根结点,没有左、右子树;的根结点,没有左、右子树; 在在F中中选取两棵根结点权值最小选取两棵根结点权值
52、最小的树作为左的树作为左、右子树构造一棵新的二叉树,且新的二叉树根结右子树构造一棵新的二叉树,且新的二叉树根结点权值为其左点权值为其左、右子树根结点的权值之和;右子树根结点的权值之和; 在在F中删除这两棵树,同时将新得到的树加入中删除这两棵树,同时将新得到的树加入F中;中; 重复、,直到重复、,直到F只含一颗树为止。只含一颗树为止。构造构造Huffman树时树时,为了规范为了规范,规定规定F=T1,T2, ,Tn中权值小的二叉树作为新构造的二叉树的左子树中权值小的二叉树作为新构造的二叉树的左子树,权值大的二叉树作为新构造的二叉树的右子树权值大的二叉树作为新构造的二叉树的右子树;在;在取值相等时
53、,取值相等时,深度小的二叉树作为新构造的二叉树深度小的二叉树作为新构造的二叉树的左子树的左子树,深度大的二叉树作为新构造的二叉树的深度大的二叉树作为新构造的二叉树的右子树右子树。 图图6-25是权值集合是权值集合W=8, 3, 4, 6, 5, 5构造构造Huffman树的过程树的过程。所构造的所构造的Huffman树的树的WPL是是: WPL=6 2+3 3+4 3+8 2+5 3+5 3 =79345568第一步第一步5568第二步第二步34768第三步第三步34755108第四步第四步5510634713第六步第六步1111100000855101863471331图图6-25 Huff
54、man树的构造过程树的构造过程第五步第五步85510186347136.6.2 赫夫曼编码及其算法赫夫曼编码及其算法1 Huffman编码编码 在电报收发等数据通讯中在电报收发等数据通讯中,常需要将传送的文字常需要将传送的文字转换成由二进制字符转换成由二进制字符0、1组成的字符串来传输组成的字符串来传输。为了使为了使收发的速度提高收发的速度提高,就要求电文就要求电文编码要尽可能地短编码要尽可能地短。此外,。此外,要设计要设计长短不等长短不等的编码,还必须保证的编码,还必须保证任意字符的编码都任意字符的编码都不是另一个字符编码的前缀不是另一个字符编码的前缀,这种编码称为,这种编码称为前缀编码前缀
55、编码。 Huffman树可以用来构造编码长度不等且译码不树可以用来构造编码长度不等且译码不产生二义性的编码产生二义性的编码。 设电文中的字符集设电文中的字符集C=c1,c2, ,ci, ,cn,各个字,各个字符出现的次数或频度集符出现的次数或频度集W=w1,w2, ,wi, ,wn。以以字符集字符集C作为叶子结点作为叶子结点,次数或频度集次数或频度集W作为结点的作为结点的权值权值来构造来构造 Huffman树树。规定。规定Huffman树中左分支代树中左分支代表表“0”,右分支代表,右分支代表“1” 。 从根结点到每个叶子结点所经历的路径分支上的从根结点到每个叶子结点所经历的路径分支上的“0”
56、或或“1”所组成的字符串所组成的字符串,为该结点所对应的编码为该结点所对应的编码,称之为称之为Huffman编码编码。 由于每个字符都是叶子结点,不可能出现在根结点由于每个字符都是叶子结点,不可能出现在根结点到其它字符结点的路径上,所以一个字符的到其它字符结点的路径上,所以一个字符的Huffman编编码不可能是另一个字符的码不可能是另一个字符的Huffman编码的前缀编码的前缀。Huffman编码方法编码方法 若字符集若字符集C=a, b, c, d, e, f所对应的权值集合为所对应的权值集合为W=8, 3, 4, 6, 5, 5,如图,如图6-25所示所示,则字符,则字符a,b, c,d,
57、 e,f所对应的所对应的Huffman编码分别是编码分别是:10,010,011,00 ,110,111。2 Huffman编码算法实现编码算法实现(1) 数据结构设计数据结构设计 Huffman树中没有度为树中没有度为1的结点棵有的结点棵有n个叶子结点个叶子结点的的Huffman树共有树共有2n-1个结点个结点,则可存储在大小为,则可存储在大小为2n-1的一维数组中。实现编码的结点结构如图的一维数组中。实现编码的结点结构如图6-26所示所示。原因原因: 求编码需从叶子结点出发走一条从叶子到根的路求编码需从叶子结点出发走一条从叶子到根的路径;径; 译码需从根结点出发走一条到叶子结点的路径。译码
58、需从根结点出发走一条到叶子结点的路径。 结点类型定义结点类型定义:#define MAX 200 /* Max_Node2n-1 */ struct HTNode unsigned int Weight ; /* 权值域权值域 */unsinged int Parent , Lchild , Rchild ; ;Weight Parent Lchild RchildWeight:权值域;:权值域; Parent:双亲结点下标:双亲结点下标Lchild, Rchild:分别标识左:分别标识左、右子树的下标右子树的下标图图6-26 Huffman编码的结点结构编码的结点结构算法算法实现实现void Create_Huffman(unsigned n, HTNode HT , unsigned m) /* 创建一棵叶子结点数为创建一棵叶子结点数为n的的Huffman树树 */ unsigned int w ; int k , j ;for (k=1 ; km ; k+) if (k=n) coutw ;HTk.weight=w ; /*
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年国有控股混合所有制企业员工持股试点意见(133号文)操作指南
- 2026年网络沉迷预防教育
- 2026年网络安全教育课程
- 2026年水电防诈骗培训
- 2026年实验室安全应急预案
- 2026年山区旅游安全攻略
- 机动护士的护理健康教育
- DB36-T 2060-2024 社会消防技术服务评价规范
- 母婴护理中的质量控制
- 急诊常用监护技术及护理
- 人音版小学六年级音乐下册全册教案【完整版】
- 四川省省属卫生事业单位公开招聘卫生专业技术岗位人员公共科目笔试大纲
- 船舶液压系统常见故障分析及解决方案
- 2023年中级注册安全工程师《安全生产专业实务(建筑施工安全)》真题及答案
- THSPP 0010-2023 欧标茶生产茶园栽培技术规程
- 延安永康330kV变电站主变扩建工程环评报告
- 危化品考试题库及答案参考
- 1213 日本当代建筑的坡屋顶的知识
- 情感性精神障碍患者的护理
- LY/T 2242-2014自然保护区建设项目生物多样性影响评价技术规范
- GB/T 33172-2016资产管理 综述、原则和术语
评论
0/150
提交评论