Pointers 加载树并按升序打印
在一个问题中,我从整数文件的元素初始化了一棵树(注意,树不一定要平衡) 然后我必须按升序打印同一棵树,即从最低到最高。 这方面的问题如下: 文件的元素是:Pointers 加载树并按升序打印,pointers,tree,pascal,freepascal,Pointers,Tree,Pascal,Freepascal,在一个问题中,我从整数文件的元素初始化了一棵树(注意,树不一定要平衡) 然后我必须按升序打印同一棵树,即从最低到最高。 这方面的问题如下: 文件的元素是: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
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.
程序加载树;
类型
IntegerFile=整数的文件
; 指针=^treeP
; treeP=记录
值:整数
; 低:指针
; 大:指针
结束
;
过程装入树(变量树:指针;变量文件:integerFile;p:Integer);
var值
:整数
;
开始
如果(tree=NIL),那么
开始
读取(文件、值);
新(树);
树^.value:=值;
树^低:=零;
树^大:=零;
结束;
如果(p<(文件大小(文件)-1)),则
开始
读取(文件、值);
seek(文件,(p+1));
如果(值
假设我已经声明了变量并初始化了文件
问题是:我能做些什么来修复它
我找不到错误,我想知道问题是在加载树中还是在尝试打印时出现的。我无法解释打印数字的顺序。但是从我读代码的方式来看,你继续在文件中找到的下一个数字下面构建树。因此,每个数字将只填写一个分支(低或大)。但是,如果当前数字大于上一个数字,而下一个数字小于当前数字,则下一个数字也可能小于上一个数字。如果您仍然跟随我,并且如果我是正确的,那么您应该始终从树的顶部输入一个新的数字,然后在每个节点上跟随树向下(是较大还是较低?),直到找到数字的正确位置(没有较大或较低)并填入(较大或较低)
在谷歌搜索了一下后:我没有运行您的代码,但从我看到的情况来看,问题在于:
if ( value < tree^.value ) then
loadTree ( tree^.low, file, ( p + 1 ) )
else
loadTree ( tree^.big, file, ( p + 1 ) );
end;
if(value
让我们看一个非常简单的顺序:
50 - 70 - 30
因此,让我们根据您的算法构建树:
我将初始节点设置为:50
然后,我选中70>50,所以我将右节点作为tree send p+1传递,其中val(p+1)=70(需要插入)。
所以,现在我的树是。50作为根,在右节点上有70。但当前节点指向70。现在,当比较下一个元素30时,检查它是否小于70,然后将其插入到70的左侧。事实上,此时,它应该被插入到值为50的节点的左侧。
您正在创建的结构不是一棵树,而是一种高度始终为n的之字形。如果我们无法从文件中看到变量和您初始化它们的内容,您的问题将非常模糊。如果你不告诉我们具体细节,我们该如何重现你的问题?请提供一个。无论我如何初始化变量或文件。你为什么想知道我是怎么打开的?您只需要知道,我打开文件时没有错误,并且只有整数数据。感谢确实很重要,否则我就不会要求提供这些信息了。如果我将您的代码复制并粘贴到编辑器中,我无法运行它来重现您的问题,因为那里没有初始化变量的代码或数据,也没有用于从中加载变量的文件。您发布的代码还使用了两种方法(
cargarArbol
和imprimirArbol
),我想这是指loadTree
和printree
,但我肯定不能像您发布的那样编译它。