数据结构树和二叉树C_第1页
数据结构树和二叉树C_第2页
数据结构树和二叉树C_第3页
数据结构树和二叉树C_第4页
数据结构树和二叉树C_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

1、第第6 6章章 树和二叉树树和二叉树6.1 6.1 树的定义和基本术语树的定义和基本术语6.2 6.2 二叉树二叉树6.3 6.3 遍历二叉树和线索二叉树遍历二叉树和线索二叉树6.4 6.4 树和森林树和森林6.6 6.6 赫夫曼树及其应用赫夫曼树及其应用6.1 6.1 树的定义和基本术语树的定义和基本术语1.1.树的逻辑定义树的逻辑定义 是由是由n(n 0)n(n 0)个结点组成的有限集合个结点组成的有限集合t t。 在任意一个非空树中:在任意一个非空树中: 有且仅有一个特定的称为根的结点;有且仅有一个特定的称为根的结点; n 1n 1时,其余结点可以分为时,其余结点可以分为m m(m 0m

2、 0)个)个互不相交的有限集互不相交的有限集t t1 1,t,t2 2,t,t3 3 , ,t,tm m,其中每一个集,其中每一个集合本身又是一棵树,且称为根的子树。合本身又是一棵树,且称为根的子树。 树的结构定义是一个递归的定义,即在树的定树的结构定义是一个递归的定义,即在树的定义中又用到树的概念,它说明了树的特性。义中又用到树的概念,它说明了树的特性。如在右图中,如在右图中, 是只有一个根结点的树是只有一个根结点的树 是有是有1313个结点的树个结点的树 其中其中a a是根,其余结点是根,其余结点分成三个分成三个互不相交的互不相交的子集:子集:t t1 1=b=b,e e,f f,k k,

3、l, l, t t2 2=c=c,g, tg, t3 3=d=d,h h,i i,j j,mm; t t1 1,t,t2 2,t,t3 3 都是都是a a的子树,且本身也是一棵树。的子树,且本身也是一棵树。则则同理按此同理按此分析方式分析分析方式分析 t t1 1 ,t ,t2 2,t,t3 3。a aa ab bc cd de ef fg gh hi ij jk kl lm m2.2.树的其它表示方法树的其它表示方法嵌套集合:是一些集合的集体,对于其中任何两个集合,嵌套集合:是一些集合的集体,对于其中任何两个集合,或不相交,或一个包含另一个的形式表示。或不相交,或一个包含另一个的形式表示。广

4、义表表示:根作为由子树森林组成的表的名字写在表的广义表表示:根作为由子树森林组成的表的名字写在表的左边。左边。凹入表示:类似书的编目。凹入表示:类似书的编目。gcabdhijekfla* b* e* f* k* l* c* g* d* h* i* j*(a(b(e, f(k,l), c(g), d(h, i, j)abcdefghijkl3.3.树的基本术语树的基本术语结点:结点:数据元素数据元素+ +若干指向其子树的分支;若干指向其子树的分支;结点的度:结点的度:结点拥有的子树数;结点拥有的子树数;树的度:树的度:树中所有结点的度的最大值;树中所有结点的度的最大值;叶子结点:叶子结点:度为零

5、的结点,或称为终端结点;度为零的结点,或称为终端结点;分支结点:分支结点:度大于零的结点,或称为非终端结点;度大于零的结点,或称为非终端结点;结点的层次:结点的层次:假设根结点的层次为假设根结点的层次为1, 1, 若某结点在若某结点在第第i i层,则其子树的根在第层,则其子树的根在第i+1i+1层;层;a ab bd de ef fh hi ij jk km m树的深度:树的深度:树中叶子结点所在的最大层次;树中叶子结点所在的最大层次;孩子结点:孩子结点:结点的子树的根;相应地该结点称为孩结点的子树的根;相应地该结点称为孩子的子的双亲结点双亲结点;兄弟结点:兄弟结点:同一个双亲的孩子之间称为兄

6、弟结点;同一个双亲的孩子之间称为兄弟结点;祖先:祖先:从根到该结点所经分支上的所有结点;从根到该结点所经分支上的所有结点;子孙:子孙:子树中任一结点;子树中任一结点;a ab bd de ef fh hi ij jk km m3.3.树的基本术语树的基本术语有序树、无序树有序树、无序树 子树之间是否存在次序关系?子树之间是否存在次序关系? 将树中结点的各子树看成从左至右是有次序的将树中结点的各子树看成从左至右是有次序的( (即不能互换即不能互换) ) 称称有序树有序树,否则称,否则称无序树无序树;森林:森林:是是m m(m0m0)棵互不相交的树的集合。)棵互不相交的树的集合。 任何一棵非空树是

7、一个二元组任何一棵非空树是一个二元组 tree = tree = (rootroot,f f) 其中:其中:rootroot被称为根结点,被称为根结点,f f被称为被称为子树森林;子树森林;a ab bd de ef fh hi ij jk km m3.3.树的基本术语树的基本术语4.4.树结构和线性结构的比较树结构和线性结构的比较 第一个数据元素(无前驱)第一个数据元素(无前驱) 最后一个数据元素(无后继)最后一个数据元素(无后继) 其它元素(一个前驱、一个后继其它元素(一个前驱、一个后继) 根结点(无前驱根结点(无前驱) 多个叶子结点(无后继多个叶子结点(无后继) 其它结点(一个前驱、多个

8、后继其它结点(一个前驱、多个后继)线线性性结结构构树结构树结构5.5.树的抽象类型定义树的抽象类型定义adt list adt list 数据对象数据对象d d:是具有相同特性的数据元素的集合:是具有相同特性的数据元素的集合数据关系数据关系r r:数据关系数据关系r r:若:若d d为空集,则称为空树;若为空集,则称为空树;若d d仅仅含一个数据元素,则含一个数据元素,则r r为空集,否则为空集,否则 r=hr=h,h h是如下是如下二元关系:二元关系: (1) (1) 在在d d中存在唯一的称为根的数据元素中存在唯一的称为根的数据元素rootroot,它在,它在关系关系h h下无前驱;下无前

9、驱; (2) (2) 若若d-root!=d-root!=,则存在,则存在 d-rootd-root的一个划分的一个划分d d1 1,d d2 2,d dm m (m0) (m0),对任意,对任意jk(1jjk(1j,kmkm) )有有d dj jddk k=,且对任意的,且对任意的 i(1im)i(1im),唯一存在数据,唯一存在数据元素元素x xi iddi i,有,有roothh;5.5.树的抽象类型定义树的抽象类型定义adt list adt list 数据关系数据关系r r: (3) (3) 对应于对应于 d-rootd-root的划分,的划分,h-rooth- ,root 有唯一的

10、一个划分有唯一的一个划分 h h1 1,h h2 2,h hm m(m(m0)0),对任意,对任意jk(1jjk(1j,kmkm) )有有 h hj jhhk k=,对,对任意任意 i(1im)i(1im),h hi i是是d di i上的二元关系,上的二元关系,(d(di i,hhi i)是一棵符合本定义的子树,称为根是一棵符合本定义的子树,称为根rootroot的子树。的子树。基本操作:基本操作: adt list adt list 树的基本操作树的基本操作1 1)root(t);root(t);初始条件:树初始条件:树t t存在;操作结果:返回存在;操作结果:返回t t的根的根2 2)v

11、alue(t, cur_e); value(t, cur_e); 初始条件:树初始条件:树t t存在,存在, cur_ecur_e是是t t中某个结点中某个结点 操作结果:返回操作结果:返回cur_ecur_e的值的值3 3)parent(t, cur_e);parent(t, cur_e); 初始条件:树初始条件:树t t存在,存在, cur_ecur_e是是t t中某个结点。中某个结点。 操作结果:若操作结果:若cur_ecur_e是是t t的非根结点,则返回它的双的非根结点,则返回它的双 亲,否则其函数值为亲,否则其函数值为“空空”。4 4)treedepth(ttreedepth(t)

12、;); 初始条件:树初始条件:树t t存在;操作结果:返回存在;操作结果:返回t t的深度。的深度。5 5)leftchild(t, cur_e);leftchild(t, cur_e); 初始条件:树初始条件:树t t存在,存在, cur_ecur_e是是t t中某个结点中某个结点 操作结果:若操作结果:若cur_ecur_e是是t t的非叶子结点,则返回它的最的非叶子结点,则返回它的最 左孩子,否则其函数值为左孩子,否则其函数值为 “ “空空”6 6)rightsibling(t, cur_e);rightsibling(t, cur_e); 初始条件:树初始条件:树t t存在,存在, c

13、ur_ecur_e是是t t中某个结点中某个结点 操作结果:若操作结果:若cur_ecur_e有右兄弟,则返回它的右兄弟有右兄弟,则返回它的右兄弟, 否否 则其函数值为则其函数值为“空空”7 7)treeempty(ttreeempty(t);); 初始条件:树初始条件:树t t存在存在 操作结果:判别操作结果:判别t t是否为空树是否为空树8) traversetree(t8) traversetree(t, visit();, visit(); 初始条件:树初始条件:树t t存在。存在。visitvisit是对结点操作的函数。是对结点操作的函数。 操作结果:按某种次序对操作结果:按某种次序

14、对t t的每个结点调用函数的每个结点调用函数 visit()visit()一次且至多一次一次且至多一次9 9)inittree(&tinittree(&t); ); 操作结果:构造空树操作结果:构造空树t t1010)assign(&t, cur_e, value); assign(&t, cur_e, value); 初始条件:树初始条件:树t t存在,存在, cur_ecur_e是是t t中某个结点。中某个结点。 操作结果:结点操作结果:结点cur_ecur_e赋值赋值valuevalue。1111)destroytree(&tdestroytree

15、(&t);); 初始条件:树初始条件:树t t存在存在 操作结果:销毁树操作结果:销毁树t t第第6 6章章 树和二叉树树和二叉树6.1 6.1 树的定义和基本术语树的定义和基本术语6.2 6.2 二叉树二叉树 6.2.1 6.2.1 二叉树的定义二叉树的定义 6.2.2 6.2.2 二叉树的性质二叉树的性质 6.2.3 6.2.3 二叉树的存储结构二叉树的存储结构6.3 6.3 遍历二叉树和线索二叉树遍历二叉树和线索二叉树6.4 6.4 树和森林树和森林6.6 6.6 赫夫曼树及其应用赫夫曼树及其应用6.2.1 6.2.1 二叉树的定义二叉树的定义 或者为空树;或者是由一个根结点加上

16、两棵或者为空树;或者是由一个根结点加上两棵分别称为左子树和右子树的、互不相交的二叉树分别称为左子树和右子树的、互不相交的二叉树组成。二叉树的结点的子树要区分左子树和右子组成。二叉树的结点的子树要区分左子树和右子树,即使在结点只有一棵子树的情况下也要明确树,即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树。指出该子树是左子树还是右子树。二叉树的五种基本形态二叉树的五种基本形态二叉树的常用操作二叉树的常用操作 某些操作和树的基本操作类似,另由于二叉树本身特某些操作和树的基本操作类似,另由于二叉树本身特性,增加的操作有:性,增加的操作有: rightchild(trightchil

17、d(t, e);, e); 初始条件:二叉树初始条件:二叉树t t存在,存在, e e是是t t中某个结点。中某个结点。 操作结果:返回操作结果:返回e e的右孩子,否则其函数值为的右孩子,否则其函数值为“空空”。 leftsibling(tleftsibling(t, e);, e); 初始条件:二叉树初始条件:二叉树t t存在,存在, e e是是t t中某个结点。中某个结点。 操作结果:返回操作结果:返回e e的左兄弟,若的左兄弟,若e e是是t t的左孩子或无左的左孩子或无左兄弟,则返回兄弟,则返回“空空”。preordertraverse(tpreordertraverse(t, vi

18、sit(); , visit(); 先序遍历先序遍历inordertraverse(tinordertraverse(t, visit(); , visit(); 中序遍历中序遍历postordertraverse(tpostordertraverse(t, visit(); , visit(); 后序遍历后序遍历levelordertraverse(tlevelordertraverse(t, visit();, visit();层序遍历层序遍历6.2.2 6.2.2 二叉树的性质二叉树的性质性质性质1 1: 在二叉树的第在二叉树的第i i层上至多有层上至多有2 2i-1i-1个结点(个结点

19、(i1i1)(利用归纳法容易证得此性质)(利用归纳法容易证得此性质)4 42 23 31 15 56 67 78 89 9101011111212131314141515性质性质2 2:深度为深度为k k的二叉树上至多含的二叉树上至多含2 2k k-1-1个结点(个结点(k1k1)(证明用求等比级数前(证明用求等比级数前k k项和的公式)项和的公式)1 12 23 34 44 42 23 31 15 56 67 78 89 9101011111212131314141515性质性质3 3: 对任一棵二叉树,若它含有对任一棵二叉树,若它含有n n0 0 个叶子结点,个叶子结点,n n2 2 个度

20、为个度为 2 2 的结点,则必存在关系式:的结点,则必存在关系式: n n0 0 = n = n2 2+1+1证明:证明:设二叉树上结点总数设二叉树上结点总数 n = nn = n0 0 + n + n1 1 + n + n2 2又二叉树上分支总数又二叉树上分支总数 b = nb = n1 1 + 2n+ 2n2 2而而 b = n -b = n - 1 = n1 = n0 0 + n + n1 1 + n + n2 2 - 1- 1由此,由此, n n0 0 = n = n2 2 + 1+ 12 23 31 14 45 56 67 78 89 9满二叉树满二叉树:深度为:深度为k k且含有且

21、含有2 2k k-1-1个结点的二叉树个结点的二叉树4 42 23 31 15 56 67 78 89 91010111112121313141415154 42 23 31 15 56 67 78 8完全二叉树完全二叉树:树中所含的:树中所含的n n个结点和满二叉树个结点和满二叉树 中编号为中编号为1 1至至n n的结点一一对应的结点一一对应。4 42 23 31 15 56 67 78 89 910101111 12121313 141415154 42 23 31 15 56 67 78 89 910101111(a)(b)(c)完全二叉树的特点完全二叉树的特点(1) (1) 叶子结点只

22、可能在层次最大的两层上出现;叶子结点只可能在层次最大的两层上出现;(2) (2) 对任一结点,若其右分支下的子孙的最大层对任一结点,若其右分支下的子孙的最大层次为次为 l l,则其左分支下的子孙的最大层次必,则其左分支下的子孙的最大层次必为为 l l 或或 l+1l+1。 性质性质4 4:具有具有n n个结点的完全二叉树的高度为个结点的完全二叉树的高度为 loglog2 2n n + 1+ 14 42 23 31 15 56 67 78 89 9101011111212证明:证明: 设完全二叉树的高度为设完全二叉树的高度为h h,则有,则有 (2(2h-1 h-1 -1 ) -1 ) n n

23、(2 (2h h -1) -1) 或或 2 2h-1 h-1 n n 2 2h h 两边取对数两边取对数 h-1h-1 log log2 2n n n n,则该结点无左孩子,否则,编号,则该结点无左孩子,否则,编号 为为2i2i的结点为其左孩子结点;的结点为其左孩子结点; 若若2i+12i+1 n n,则该结点无右孩子结点,否则,则该结点无右孩子结点,否则 ,编号为,编号为2i+12i+1的结点为其右孩子结点。的结点为其右孩子结点。4 42 23 31 15 56 67 78 89 91010111112126.2.3 6.2.3 二叉树的存储结构二叉树的存储结构 (1 1)二叉树的顺序存储表

24、示)二叉树的顺序存储表示(2 2)二叉树的链式存储表示)二叉树的链式存储表示1.1.二叉树的顺序存储表示二叉树的顺序存储表示 #define max_tree_size 100 #define max_tree_size 100 / / 二叉树的最大结点数二叉树的最大结点数 typedef telemtypetypedef telemtype sqbitreemax_tree_size sqbitreemax_tree_size; ; / 0/ 0号单元存储根结点号单元存储根结点 sqbitree btsqbitree bt; ; 按照顺序存储结构的定义,在此约定,用一按照顺序存储结构的定义,

25、在此约定,用一组地址连续的存储单元依次组地址连续的存储单元依次自上而下、自左至右自上而下、自左至右存储完全二叉树上的结点元素,即将完全二叉树存储完全二叉树上的结点元素,即将完全二叉树上编号为上编号为 i i的结点元素存储在如上定义的一维数的结点元素存储在如上定义的一维数组中下标为组中下标为 i-1 i-1 的分量中。的分量中。4 42 23 31 15 56 67 78 89 91010111112121 12 23 34 45 56 67 78 89 9101011111212数组下标:数组下标:0 1 2 3 4 5 6 7 8 9 10 110 1 2 3 4 5 6 7 8 9 10

26、112 23 31 14 45 56 67 78 81 12 23 30 04 45 56 60 00 07 70 08 8 一般二叉树必须按完全二叉树的形式存储,一般二叉树必须按完全二叉树的形式存储,将造成存储的浪费。将造成存储的浪费。顺序存储结构的性能分析顺序存储结构的性能分析顺序存储结构仅适用于顺序存储结构仅适用于完全二叉树完全二叉树。因为,在最坏的情况下,一个深度为因为,在最坏的情况下,一个深度为k k且只有且只有k k个结点的单支树(树中不存在度为个结点的单支树(树中不存在度为2 2的结点)的结点)却需要长度为却需要长度为2 2k k-1-1的一维数组。这样就造成存的一维数组。这样就

27、造成存储空间的浪费。储空间的浪费。30301111555566660 02 26 61414红字红字为对应结点在顺序为对应结点在顺序结构中相应的位置结构中相应的位置下标下标2.2.二叉树的链式存储结构二叉树的链式存储结构 由二叉树的定义得知,二叉树的结点由一个由二叉树的定义得知,二叉树的结点由一个数据元素数据元素和分别指向其和分别指向其左、右子树左、右子树的两个分支构的两个分支构成,则表示二叉树的链表中的结点至少包含三个成,则表示二叉树的链表中的结点至少包含三个域:域:数据数据和和左、右指针域左、右指针域。datadatalchildlchildrchildrchildparentparent

28、二叉树的结点二叉树的结点dbcefaecbdf二叉链表二叉链表lchilddatarchilda二叉树的二叉链表存储表示二叉树的二叉链表存储表示typedef struct bitnodetypedef struct bitnode telemtype telemtype data; data; struct bitnode struct bitnode * *lchild,lchild,* *rchildrchild; ; / / 左右孩子指针左右孩子指针bitnode, bitnode, * *bitreebitree; ;parentaecbdf三叉链表三叉链表rchilddatalch

29、ildbdcefa二叉树的三叉链表存储表示二叉树的三叉链表存储表示typedef struct tritnodetypedef struct tritnode telemtype telemtype data; data; struct tritnode struct tritnode * *lchild,lchild,* *rchildrchild; ; / / 左右孩子指针左右孩子指针 struct tritnodestruct tritnode * *parent; / parent; / 双亲指针双亲指针 tritnode tritnode, , * *tritreetritree;

30、; 在不同的存储结构中,实现二叉树的操作方在不同的存储结构中,实现二叉树的操作方法亦不同,如找结点法亦不同,如找结点 x x 的双亲的双亲 parent(tparent(t,e)e),在三叉链表中很容易实现,而在二叉链表中则需在三叉链表中很容易实现,而在二叉链表中则需从根指针出发巡查。从根指针出发巡查。 由此,在具体应用中采用什么存储结构,除由此,在具体应用中采用什么存储结构,除了根据二叉树的形态之外,还应考虑需进行何种了根据二叉树的形态之外,还应考虑需进行何种操作。操作。总结总结 本讲我们学习了树和二叉树的定义,重点介本讲我们学习了树和二叉树的定义,重点介绍了二叉树的性质和存储结构,二叉树是非常重绍了二叉树的性质和存储结构,二叉树是非常重要的数据结构,请同学们重点掌握,在下一讲中要的数据结构,请同学们重点掌握,在下一讲中我们将学习二叉树的遍历和线索化操作。我们将学习二叉树的遍历和线索化操作。练习题练习题1. 1. 假设在树中,结点假设在

温馨提示

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

评论

0/150

提交评论