在一个问题中,我从一个整数文件的元素初始化一个树(注意树不一定要平衡)。
然后我必须按升序打印同一棵树,即从最低到最高。 这个问题如下:
该文件的元素是:1 - 5 - 90 - 0 - 50 - 70
因此,预期的打印是:0 - 1 - 5 - 50 - 70 - 90
(从低到高),但控制台显示:5 - 0 - 50 - 1 - 70 - 90
program loadTree;
type
IntegerFile = file of Integer
; pointer = ^treeP
; treeP = record
value : Integer
; low : pointer
; big : pointer
end
;
procedure loadTree ( var tree: pointer; var file: integerFile; p : Integer );
var value
:Integer
;
begin
if ( tree = NIL ) then
begin
read ( file, value );
new ( tree );
tree^.value := value;
tree^.low := NIL;
tree^.big := NIL;
end;
if ( p < ( filesize ( file ) - 1 ) ) then
begin
read ( file, value );
seek ( file, ( p + 1 ) );
if ( value < tree^.value ) then
loadTree ( tree^.low, file, ( p + 1 ) )
else
loadTree ( tree^.big, file, ( p + 1 ) );
end;
end;
procedure printTree ( tree: pointer );
begin
if ( tree <> nil ) then
begin
printTree ( tree^.low );
writeln ( arbol^.value );
printTree ( tree^.big );
end;
end;
(...)
Begin
(...)
cargarArbol ( tree, file, 0 );
imprimirArbol ( tree );
(...)
end.
假设我已经声明了变量并初始化了文件
问题是:我能做些什么来解决它?
我找不到错误,我想知道问题是在树的加载中还是在我尝试打印时。
答案 0 :(得分:0)
我无法解释数字的打印顺序。但是从我阅读代码的方式来看,你继续构建文件中下一个数字下面的树。因此,每个数字只有一个分支(低或大)。但是,如果当前号码大于前一个号码并且下一个号码小于当前号码,则下一个号码也可能小于前一个号码。如果你仍然关注我,如果我是正确的,那么你应该总是从树的顶部输入一个新的数字,然后在每个节点跟随树(更大还是更低?),直到它的正确位置找到数字(不大或小)并填写(大或小)。
点击后搜索:http://mypascalbook.blogspot.com/2009/11/14-pointer-basics-binary-tree-lists-in.html
答案 1 :(得分:0)
我没有运行你的代码,但从我看到的,问题出在这里:
if ( value < tree^.value ) then
loadTree ( tree^.low, file, ( p + 1 ) )
else
loadTree ( tree^.big, file, ( p + 1 ) );
end;
让我们采取一个非常简单的序列: 50 - 70 - 30 因此,让我们根据您的算法构建树: 我创建初始节点:50
然后,我检查70&gt; 50,所以我传递我的右节点为树发送p + 1,其中 val(p + 1)= 70 (这需要插入)。 所以,现在我的树是。 50作为root,在右节点上有70。但是当前节点指向70.现在,当您比较下一个元素(即30)时,检查它是否小于70并将其插入到70的左侧。实际上,此时它应该已插入到具有值50的节点的左侧。 你正在制作的结构不是树,它是一种高度为n的之字形。