[学科竞赛]树.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[学科竞赛]树

主要技巧: procedure dfs(x,y:Longint); var x1,y1,i:longint; begin map[x,y]:=false; for i:=1 to 4 do begin x1:=x+fx[i,1]; y1:=y+fx[i,2]; if (x1 0) and (y1 0) and (x1 = n) and (y1 = s[x1]) and (map[x1,y1]) then dfs(x1,y1); end; end; * * ⑷ 又得到一个新二叉树的集合F,其根结点的权值分别为34,41(如下图): ⑸最后得到最优二叉树(如下图),其根结点的权值为75,结点数为2*5-1=9。 动画演示 在最优二叉树中非叶结点的度均为2,因此采用顺序存储结构为宜。如果带权叶结点数为n个,则最优二叉树的结点数为2n-1个。由此得出最优二叉树的数据类型定义 【参考程序】 Program hufmtree; Const n=5; m=2*n-1; {最优二叉树的结点数} Type node=record {结点类型} data:integer; {权值} prt,lch,rch:0..m; {父指针、左、右指针和路径长度} end; treetype=array[1..m] of node; {最优二叉树的数组类型} Var tree:treetype;{其中tree [1‥n]为叶结点,tree [n+1‥2n-1]为中间结点,根为tree [2n-1]} i,k,j:integer; {在最优二叉树的顺序存储结构中前n个结点为叶结点。构造最优二叉树的算法如下:} procedure hufm(var tree:treetype); function min (h:integer):integer;{在前h个结点中选择父指针为0且权值最小的结点min} var m1,p,i:integer; begin m1:=32767; for p := 1 to h do if (tree[p].prt=0)and(m1tree[p].data) {没有父亲结点且较小的结点} then begin i:= p;m1:= tree[p].data; end;{then} min:= i; end;{min} begin for k:= n+1 to m do {构造最优二叉树生成n-1个新结点} begin {计算k为根的左儿子和右儿子} i:= min(k-1); tree[i].prt:= k; tree[k].lch:= i; j:= min(k-1); tree[j].prt:= k; tree[k].rch:= j; tree[k].data:= tree[i].data+tree[j].data; end;{for} end;{hufm} begin fillchar (tree,sizeof(tree),0); {构造初始集合F} for i:= 1 to n do read(tree[i].Data); hufm(tree); for i:=1 to m do writeln(tree[i].data);{输出最优二叉树的每个结点的数据域} end. 【输入样例】16 2 18 16 23 【输出样例】16 2 18 16 23 18 34

文档评论(0)

qiwqpu54 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档