收藏 分享(赏)

算法与数据结构讲义四(数据结构——树).doc

上传人:dzzj200808 文档编号:2295225 上传时间:2018-09-09 格式:DOC 页数:16 大小:394KB
下载 相关 举报
算法与数据结构讲义四(数据结构——树).doc_第1页
第1页 / 共16页
算法与数据结构讲义四(数据结构——树).doc_第2页
第2页 / 共16页
算法与数据结构讲义四(数据结构——树).doc_第3页
第3页 / 共16页
算法与数据结构讲义四(数据结构——树).doc_第4页
第4页 / 共16页
算法与数据结构讲义四(数据结构——树).doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

1、第十四课 数据结构树12.0 树型结构12.1 树的应用12.2 二叉树及其应用12.3 霍夫曼二叉树12.4 线段树12.0 树型结构(一)树的定义树是一种数据结构,它是由 n(n=1)个有限结点组成一个具有层次逻辑关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:(1)每个结点有零个或多个子结点; (2)每一个子结点只有一个父结点; (3)没有前驱的结点为根结点; (4)除了根结点外,每个子结点可以分为 m个不相交的子树; (二)树的有关术语(1)节点的度:一个节点含有的子树的个数称为该节点的度; (2)叶节点或终端节点:度为零的节点

2、称为叶节点; (3)非终端节点或分支节点:度不为零的节点; (4)双亲节点或父节点:若一个结点含有子节点,则这个节点称为其子节点的父节点; (5)孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; (6)兄弟节点:具有相同父节点的节点互称为兄弟节点; (7)树的度:一棵树中,最大的节点的度称为树的度; (8)节点的层次:从根开始定义起,根为第 0层,根的子结点为第 1层,以此类推; (9)树的高度或深度:树中节点的最大层次; (10)堂兄弟节点:双亲在同一层的节点互为堂兄弟; (11)节点的祖先:从根到该节点所经分支上的所有节点; (12)子孙:以某节点为根的子树中任一节点都称为

3、该节点的子孙。 (13)森林:由 m(m=0)棵互不相交的树的集合称为森林;(三)树的物理存储一般使用数组来线性存储树中各节点的数据本身,但为了记录各节点之间的父子关系,需要附加存储父亲或孩子节点所在的位置。1、 双亲表示法:可以存储为: 1 2 3 4 5 6 7 8 9 10 11优点:(1) 节省空间。(2) 便于从下向上访问(记录了从孩子到父亲的逻辑关系) 。(3) 便于随时插入新的子树。缺点:不利于从上向下的访问。 (未记录父亲到孩子的逻辑关系) 。例如:利用所给边集创建双亲表达树输入:第一行两个整数 n,m ,表示节点个数和边的条数下面 m 行,每行 2 个整数,表示两个节点存在父

4、子关系输出:如上的双亲表示法的树program maketree; /时间复杂度 O(nlogn)const maxn=12;var inf,outf:text;bian:array1maxn,12of integer; /存储边集tree,num:array1maxnof integer; /存储树、各节点的度t:array1maxnof boolean; /哈希n,m,i,j,k:integer;/procedure init;beginassign(inf,maketree.in); assign(outf,maketree.out);reset(inf);readln(inf,n,m)

5、;for i:=1 to m dobeginreadln(inf,biani,1,biani,2);A B C D E F G H I J K1 1 1 2 4 4 5 5 5 7inc(numbiani,1); inc(numbiani,2); /统计各节点的度end;end;/procedure make;begini:=1; k:=0;fillchar(t,sizeof(t),true);while k1 do i:=i mod n+1; /查找度为 1 的节点j:=1;while not(tjand(bianj,1=i)or(bianj,2=i) do inc(j); /找到包含该if

6、 jn then break; /节点的边tj:=false;if bianj,1=i then treei:=bianj,2;if bianj,2=i then treei:=bianj,1;dec(numbianj,1); dec(numbianj,2);inc(k);end;end;/procedure print;beginrewrite(outf);for i:=1 to n do write(outf,i:3); writeln(outf);for i:=1 to n do write(outf,treei:3);close(outf);end;/begininit;make;pr

7、int;end. 2、孩子表示法:(一般二叉树使用)1 2 3 4 5 6 7 8 9 10 11A B C D E F G H I J K2 5 6 8 113 7 94 10优点:(1) 便于从上向下的访问。(2) 便于随时删除子树。缺点:占用空间过大且不确定(使用链表时例外) 。3、混合表示法:既记录双亲关系又记录孩子关系。12.1 树的应用(一)并查集并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。并查集的存储一般采用双亲表示法。一般为了提高使用效率,会附加储存一些信息,如:该节点下属节点个数、该节点到达根的距

8、离等。1、基本操作:一开始时,所有元素都分属于各个独立的集合。(1)查找某结点的根:function get_father(x:integer):integer; /传入待查找的结点序号beginwhile fatherxyy then fatherxx:=yy;end; (3)判断两个结点是否属于一个集合:function same(x,y:integer):boolean;beginif get_father(x)=get_father(y) then same:=trueelse same:=false;end; 2、并查集的优化:并查集在使用时,一旦结点多起来,就有可能退化成为一条链,

9、这时,查找结点的祖先或判断两个结点是否是同一集合的复杂度就会称为 O(n)。(1)合并时将元素所在深度低的集合合并到元素所在深度高的集合。(附加存储集合中根的深度 ranki)procedure join_rank(x,y:integer);var xx,yy:integer;beginxx:=get_father(x);yy:=get_father(y);if rankxxrankyy then fatheryy:=xxelse fatherxx:=yy;if rankxx=rankyy then inc(rankyy);end;(2)路径压缩我们找到最久远的祖先时“顺便”把它的子孙直接连接

10、到它上面。function get_father(x:integer):integer;var xx,y:integer;beginxx:=x;while fatherxxxx dobeginy:=fatherx;fatherx:=xx;x:=y;end;end;3、例题:(1) 亲戚(Relations)或许你并不知道,你的某个朋友是你的亲戚。他可能是你的曾祖父的外公的女婿的外甥的表姐的孙子。如果能得到完整的家谱,判断两个人是否亲戚应该是可行的,但如果两个人的最近公共祖先与他们相隔好几代,使得家谱十分庞大,那么检验亲戚关系实非人力所能及.在这种情况下,最好的帮手就是计算机。为了将问题简化,你

11、将得到一些亲戚关系的信息,如同 Marry和 Tom是亲戚,Tom 和 B en是亲戚,等等。从这些信息中,你可以推出 Marry和 Ben是亲戚。请写一个程序,对于我们的关心的亲戚关系的提问,以最快的速度给出答案。输入格式 输入由两部分组成。第一部分以 N,M 开始。N 为问题涉及的人的个数(1 N 20000)。这些人的编号为 1,2,3,N。下面有 M行(1 M 1000000),每行有两个数ai, bi,表示已知 ai和 bi是亲戚.第二部分以 Q开始。以下 Q行有 Q个询问(1 Q 1 000 000),每行为 ci, di,表示询问 ci和 di是否为亲戚。对于每个询问 ci, d

12、i,若 ci和 di为亲戚,则输出 Yes,否则输出 No。样例输入与输出输入 relation.in10 72 45 71 38 91 25 62 333 47 108 9输出 relation.outYesNoYes(2) 银河英雄传说【问题描述】公元五八一年,地球居民迁移至金牛座 第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展。宇宙历七九九年,银河系的两大军事集团在 巴米利恩星域 爆发战争。泰山压顶集团派宇宙舰队司令 莱因哈特 率领十万余艘战舰出征,气吞山河集团点名将 杨威利 组织麾下三万艘战舰迎敌。杨威利擅长排兵布阵,巧妙运用各种战术屡次以少胜多,难

13、免恣生骄气。在这次决战中,他将巴米利恩星域战场划分成 30000列,每列依次编号为 1, 2, , 30000。之后,他把自己的战舰也依次编号为 1, 2, , 30000,让第 i号战舰处于第 i列(i = 1, 2, , 30000),形成“一字长蛇阵”,诱敌深入。这是初始阵形。当进犯之敌到达时,杨威利会多次发布合并指令,将大部分战舰集中在某几列上,实施密集攻击。合并指令为 M i j,含义为让第 i号战舰所在的整个战舰队列,作为一个整体(头在前尾在后)接至第 j号战舰所在的战舰队列的尾部。显然战舰队列是由处于同一列的一个或多个战舰组成的。合并指令的执行结果会使队列增大。然而,老谋深算的莱

14、因哈特早已在战略上取得了主动。在交战中,他可以通过庞大的情报网络随时监听杨威利的舰队调动指令。在杨威利发布指令调动舰队的同时,莱因哈特为了及时了解当前杨威利的战舰分布情况,也会发出一些询问指令:C i j。该指令意思是,询问电脑,杨威利的第 i号战舰与第 j号战舰当前是否在同一列中,如果在同一列中,那么它们之间布置有多少战舰。作为一个资深的高级程序设计员,你被要求编写程序分析杨威利的指令,以及回答莱因哈特的询问。最终的决战已经展开,银河的历史又翻过了一页【输入文件】输入文件 galaxy.in的第一行有一个整数 T(11,则序号为 i的结点的双亲结点的序号为 i/2(“/”表示整除);如果 i

15、1,则序号为 i的结点是根结点,无双亲结点。(2)如果 2in,则序号为 i的结点的左孩子结点的序号为 2i;如果 2in,则序号为 i的结点无左孩子。(3)如果 2i1n,则序号为 i的结点的右孩子结点的序号为 2i1;如果 2i1n,则序号为 i的结点无右孩子。五、二叉树的物理存储:1、对于满二叉树或完全二叉树,一般采用一维数组,只存储结点数据即可,其逻辑关系可根据二叉树的性质直接确定。对于下标为 i的结点,其双亲结点位置的下标为 i/2,其左孩子结点位置的下标为 2*i、右孩子结点位置的下标为 2*i+1。如:堆、线段树的存储。2、对于非满二叉树,如果使用第一种方法存储,则空间过于浪费,

16、一般采用地址标记法存储,且由于二叉树的度是不超过 2的,因此,主要采用孩子表示法。如:可记录为:结点数据 A B C D E F G H I双亲地址 0 1 1 2 2 3 3 5 5左子树地址 2 4 6 8右子树地址 3 5 7 9实际使用时,可根据需要省去双亲地址的记录。六、二叉树的基本操作:var tree:array1maxn,13of integer;1、初始化一棵空二叉树:Fillchar(tree,sizeof(tree),0) ;2、将新数据作为结点插入到树中,根据数据属性,大于根则插入到右子树、小于根插入到左子树中。基本框架:procedure make_tree(待插入数

17、据; 结点地址); /递归子程序,主程序调用时地址为 1。beginif 待插入数据的属性需查找数据 thenbegin if 需查找数据的属性tree_dd thenbeginif stree_dd thenbeginif treed,1=0 then /比当前根小的里面找不到begininc(max); /max为全局变量,记录树中最大结点序号tree_dmax:=s;treed,1:=max;find:=0;endelse find:=find(s,treed,1); /转到左子树中继续查找end elsebeginif treed,2=0 then /比当前根大的里面找不到begininc(max);tree_dmax:=s;treed,2:=max;find:=0;endelse find:=find(s,treed,2);end;endelse find:=d; /如果找到,返回数据所在结点序号end; /如果找不到,返回函数值0例一:

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

当前位置:首页 > 高等教育 > 大学课件

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


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

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

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