procedure creattree(var p:biptr);
var ch:char;
q:biptr;
begin
read(ch);
if ch<>'*' then begin
new(q); q^.data:=CH;q.lc:=nil;q.rc:=nil;
p:=q;q:=nil;dispose(p);
creattree(p^.lc);
creattree(p^.rc);
end
else p:=nil;
end;
var ch:char;
q:biptr;
begin
read(ch);
if ch<>'*' then begin
new(q); q^.data:=CH;q.lc:=nil;q.rc:=nil;
p:=q;q:=nil;dispose(p);
creattree(p^.lc);
creattree(p^.rc);
end
else p:=nil;
end;
解决方案 »
- Delphi6在XP下开发的程序在Win7 上窗体字体变大,如何解决?
- Byte类型转换?
- 如何将数据读到treeview中?
- 在delphi8.0里,使用WinSock时在程序里写"uses WinSock",程序就会出错,应该怎么写?急急急
- 如何检测快捷键盘,比如ctr+c,执行一段代码
- 关于telnet的IdTelnet的问题!
- EhLib70的下载
- Object Pascal中局部对象的问题
- 请问哪里有DELPHI教学的视频啊?
- 求《Delphi4从入门到精通》《Delphi 3从入门到精通》《Delphi高级开发指南》三本书的电子版,格式不限
- 怎样用delphi做一个时钟触发器(详细见内)
- 怎样定义运行时创建控件的procedure
var ch:char;
q:biptr;
begin
read(ch);
if ch<>'*' then begin
new(q); q^.data:=CH;q.lc:=nil;q.rc:=nil;
p:=q;q:=nil;dispose(q);
creattree(p^.lc);
creattree(p^.rc);
end
else p:=nil;
end;
你的creattree是通过先根遍历序列来生成树。你调试的时候总也是见不到输出结果吧?因为程序总是等待你的输入,这个原因很简单。你看看你的CreateTree,如果要中止递归,只有输入为*,但是每次递归的结果都产生两个相同的递归分支,也就是说必须要输入叶子的两倍的*,才能结束递归。
具体地说,对于树
a -- b
|
+--- c
如果你输入abc*,那么程序会认为是这样的树
a -- b -- c -- *
|
+--- ?
然后等待你输入?的内容
所以你必须输入
ab**c**
才能得到结果,程序识别过程如下:
a -- b -- *
| |
| +--- *
|
+--- c -- *
|
+ -- *
procedure output(p:biptr);
begin
if p<>nil then begin
writeln (p^.data);
output(p^.lc);
output(p^.rc);
end;
end; <---这里少了一个end;然后你输入ab**c**回车
得到输出:
a
b
c
a--c--e
| |
| d--f
b你应该先把缺少了左或者右的节点补上*,变成
a--c--e--*
| |
| d--f--*
| |
| *
|
f--*
|
*
执行程序的时候,输入上面加了*的树的先根遍历,也就是:
ab**cd*f**e**回车
就可以得到输出了,输出是先根遍历没有*号,也就是:
a
b
c
d
f
e明白了吧?
呵呵,我可够累的,你也应该多给我点分数啊 :)
http://www.csdn.net/expert/topic/509/509751.shtm