博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
后缀转中缀的另一种方法——二叉树的遍历
阅读量:5131 次
发布时间:2019-06-13

本文共 3145 字,大约阅读时间需要 10 分钟。

 

鉴于自己虽然在向总的带领下学了树但是从来都没有用过。

在数据结构的书上,关于二叉树有这样的一段内容:当我们把表达式依照一定的规则,构成一棵树的时候,中序遍历再加一些括号是正常的表达式,后序遍历是逆波兰式。

所以,用逆波兰式构成一棵树,再依照中序遍历的法则,将后缀表达式转为中缀表达式。

构造一棵树不难,主要是添括号的问题。

所以 测了多次,问题总是出现在 compare函数上(程序里成comepare了),

不过感觉这个comepar函数还是比较好写的,相比起 用栈来做。。。。。

主要是减号和除号的问题。。。

1 program expression;  2 type  3         point=^rec;  4         rec=record  5             left,right:point;  6             ch:char;  7                 end;  8 var  9         i,j,k,l,m,n:longint; 10         st,stt:string; 11         h:point; 12 procedure make(var l:longint;p:point); 13 var 14         i,j,k,m,n:longint; 15 begin 16       if l>=1 then begin 17       if(ord(st[l])<65)or(ord(st[l])>90)then 18         begin 19         p^.ch:=st[l]; 20         dec(l); 21         new(p^.right); 22         make(l,p^.right); 23         dec(l); 24         new(p^.left); 25         make(l,p^.left); 26         end 27       else 28         begin 29         p^.ch:=st[l]; 30         p^.left:=nil; 31         p^.right:=nil; 32         end; 33       end; 34 end; 35 {
===============================================================} 36 function print(p:point):ansistring; 37 var 38 a,b,c,d:string; 39 bool1,bool2:boolean; 40 le,ri,mi:char; 41 function comepare(a,b:char):char; 42 var 43 x,y:longint; 44 begin 45 if(((a='-')and((b='-')or(b='+')))or((a='/') and ((b='/')or(b='*'))))then exit('>'); 46 case a of 47 '+','-':x:=2; 48 '*','/':x:=4; 49 end; 50 case b of 51 '+','-':y:=2; 52 '*','/':y:=4; 53 end; 54 if x>y then exit('>') 55 else exit('<'); 56 end; 57 {
===============================================================} 58 begin 59 bool1:=true; 60 bool2:=true; 61 print:=''; 62 if p^.left<>nil then 63 begin 64 le:=p^.left^.ch; 65 ri:=p^.right^.ch; 66 mi:=p^.ch; 67 if(ord(le)>=65)and(ord(le)<=90)then bool1:=false; 68 if(ord(ri)>=65)and(ord(ri)<=90)then bool2:=false; 69 begin 70 if(comepare(mi,le)='>')and((mi<>'-')or((le<>'-')and(le<>'+')))and((mi<>'/')or((le<>'/')and(le<>'*')))and bool1 then 71 begin 72 a:='('; b:=')'; 73 end 74 else 75 begin 76 a:='';b:=''; 77 end; 78 if (comepare(mi,ri)='>')and bool2 then 79 begin 80 c:='('; d:=')'; 81 end 82 else 83 begin 84 c:='';d:=''; 85 end; 86 print:=a+print(p^.left)+b+mi+c+print(p^.right)+d; 87 end 88 end 89 else exit(p^.ch); 90 end; 91 begin 92 assign(input,'expression.in'); 93 assign(output,'expression.out'); 94 reset(input); 95 rewrite(output); 96 readln(st); 97 l:=length(st); 98 new(h); 99 make(l,h);100 stt:=print(h);101 write(stt);102 close(input);103 close(output);104 end.

 

转载于:https://www.cnblogs.com/zyxx233/archive/2013/01/25/2877298.html

你可能感兴趣的文章
51 nod 1624 取余最长路 思路:前缀和 + STL(set)二分查找
查看>>
c# linq <未完>
查看>>
模型选择评估方法
查看>>
Beta 冲刺(4/7)
查看>>
Spring 配置相关
查看>>
深入理解Java:注解(Annotation)基本概念
查看>>
NAT基本原理
查看>>
Java Content Repository API 简介 转自(https://www.ibm.com/developerworks/cn/java/j-jcr/)
查看>>
visio二次开发——图纸解析
查看>>
Activity之间的跳转:
查看>>
iTunes Connect 开发者上手经验(转)
查看>>
vertical-align你为什么不生效
查看>>
request.getReader()的怪异事件
查看>>
C++ 实践总结
查看>>
composer 国内镜像配置
查看>>
软件是天时、地利、人和的产物!
查看>>
Oracle数据误删除的恢复操作
查看>>
python定时清空本目录下除本脚本外的全部文件
查看>>
【PHP】在目标字符串指定位置插入字符串
查看>>
【JS】jQuery设置定时器,访问服务器(PHP示例)配合微信、支付宝原生支付,跳转web网页...
查看>>