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
,但我肯定不能像您发布的那样编译它。