网站大量收购闲置独家精品文档,联系QQ:2885784924

趣谈数据结构(八)83.doc

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

趣谈数据结构(八)83 读书破万卷,下笔如有神——杜甫 趣谈数据结构(八) 上一讲我们了解了树,并建立树的基本概念与基本的处理方式 这一讲我们通过几个例子,阐明树的存储方式,树的几个典型的应用,给出了一些常用的算法源程序如下 这些算法源程序如下意在给大家解决有关树问题时,提供一些思考的方向   例1 将一棵一般树(由单字符组成)转换成二叉树, 并将转换得到的二叉树按先序、中序、后序进行遍历,输出遍历后结点的序列   一般树输入方式用父亲与孩子间加括号的串表示   例如,图1所示的树,串表示输入为:A(B(E)C(FG)D(H(IJK))) 图 1     分析:一般树转化为二叉树的方法为:将结点的第一个孩子作为形成二叉树后结点的左孩子,结点的右邻兄弟作为形成二叉树后结点的右孩子   如图1的树,根结点A的第一个孩子为结点B,则结点B为转化二叉树后结点A的左孩子,结点C是结点B的右邻兄弟,则结点C为转化二叉树后结点B的右孩子,同样,结点D是结点C的右邻兄弟,则为其转化后的右孩子 类推,图2转化后的二叉树形式如图2所示   分析输入的树串形式可知,左括号后的字符为左括号前字符的左孩子,括号内的字符关系是兄弟,则转化为二叉树后,后面字符为其前一字符的右孩子 故依据左、右括号及字符间的关系,生成结点的左右孩子   算法步骤:   ⒈输入串表示的树,并判断输入的树是否合法   ⒉建立二叉树,设D$存储结点的内容,L、R为其左右孩子的指针,T为操作栈   建立方法:(1)取第一个字符作为根结点;(2)遇左括号,左括号后字符作为括号前字符结点的左孩子并入操作栈,其它字符为前一字符结点的右孩子,代替栈顶结点;(3) 遇右括号,栈顶指针减1,右括号后字符为栈顶指针指向字符结点的右孩子   ⒊按先序遍历算法遍历二叉树             ⒋按中序遍历算法遍历二叉树             ⒌按后序遍历算法遍历二叉树   源程序如下: program tree1; uses crt; type tree=^tre; tre=record note:char; son,bro:tree; end; var root:tree; procedure err; begin writeln(Input Error!); halt; end; procedure reads; {读入树串,边判错边建立二叉树} const ch:set of char=[A..Z,a..z]; var st:string; ss:set of char; i:byte; procedure reading(var p:tree); var q:tree; begin inc(i); case st[i] of (:begin reading(p); INC(I); if st[i]) then err; end; A..Z,a..z: begin if (st[i] in ss) then err; p^.note:=st[i]; ss:=ss+[st[i]]; if (ilength(st)) and (st[i+1]=() then begin new(q);q^.son:=nil;q^.bro:=nil; p^.son:=q; reading(q); end; if (ilength(st)) and (st[i+1] in ch) then begin new(q);q^.son:=nil;q^.bro:=nil; p^.bro:=q; reading(q); end; end; else err; end; end; begin write(The String:); readln(st); if not (st[1] in ch) then err; new(root);root^.son:=nil;root^.bro:=nil; i:=0;ss:=[]; reading(root); if ilength(st) then err; end; procedure pro(p:tree);{先序遍历} begin if pnil then with p^ do begin write(note); pro(son); pro(bro); end; end; procedure mid(p:tree);{中序遍历} begin if pnil then with p^ do begin mid(son); write(note); mid(bro); end; end; procedure suc(p:tree);{后序遍历} begin if pnil then with p^ do begin suc(son); suc(bro); write(no

文档评论(0)

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

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

版权声明书
用户编号:8000054077000003

1亿VIP精品文档

相关文档