pascal建树的问题

来源:百度知道 编辑:UC知道 时间:2024/05/26 18:51:24
type treetype=record
data:char;
ftr:integer;
lch:integer;
rch:integer;
end;
var
tree:array[1..100] of treetype;
i:integer;

procedure readtree(a:integer);
var temp:char;
lch:integer;
rch:integer;
ftr:integer;
begin
if a=0 then exit;

lch:=tree[a].lch;
rch:=tree[a].rch;
ftr:=tree[a].ftr;

if (lch=0) then
begin inc(i);
read(tree[i].data); //这行###################################
tree[a].lch:=i; tree[i].ftr:=a; readtree(i); end
else if (rch=0) then begin inc(i); read(tree[i].data); tree[a].rch:=i; tree[i].ftr:=a; readtree(i) end
else readtree(ftr);

end;

begin//prog

i:=1;
fillchar(tree,sizeof(tree),0);
readtree(1);
end.

我想用pascal建一个树,但第二次递归运行到 一大堆井号那行 居然不提示输入数据,为什么?
请问 yuhangch :
如何忽略掉 chr(10) chr(13)呢? chr(13)是什么意思?<

可以用文件流来理解。
第一次读入的时候fp将所有文件流贮存内容都读入,并且认为是读入了程序所需的全部信息。直到用完了流中所有的值,然后如果这时候还需要数据,才再到文件流中读取数据。
所以结合LZ的现象,LZ可以仔细再F7一下,就会发现只是第二次和第三次不需要提示输入,第四次还是提示输入的。
因为比如输入a 回车
实际上流中的值为 a chr(10) chr(13)
(PS:回车符有两个字符)
--------------分割线------------
很奇怪,LZ的程序没有结束条件。应该一开始就读入节点个数吧,然后一开始就输入n个字符。
readln也可以,它会自动忽略掉一个回车符。
--------------分割线------------
说实话我没有看懂你的建树建的是什么树。按照过程貌似是一棵二叉树,但这样建立的二叉树是单链的, if a=0 then exit这句话是不会有用的。
如果真的要建立二叉树的话是不能这样建立的。至少你应该设定二叉树的层数或者每个节点的高度。
你可以输入一个长度为10的串,然后 if a=0 then exit 改成 if a=11,在程序结束前把这棵树所有节点的lch,rch,ftr依次输出来,看看构树的结果。
--------------分割线------------
如果你还是对这个构树有什么问题,我的建议是对它不用考虑太多。构这样的树的题目是非常少的,特别是对于二叉树。
你还可以参考二叉排序树的建立。里面的构树过程希望对你有用。
--------------分割线------------
楼上说的楼下现在真的变成了楼下。。
--------------分割线------------
chr(13) = 回车符 chr(10) = 换行符
为什么一个回车等于这两个字符我也不知道。。
回车 = eoln ,所以可以加上一句: if eoln then readln; 这样就忽略了chr(10) chr(13)。
read(ch)读入的是单字符。
--------------分割线-----