-1

在一个问题中,我从整数文件的元素初始化一棵树(请注意,树不一定必须是平衡的)。

然后我必须按升序打印同一棵树,即从最低到最高。问题如下:

该文件的元素是: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.

假设我已经声明了变量并初始化了文件

问题是:我能做些什么来解决它?

我找不到错误,我想知道问题是在树的负载上还是在我尝试打印它时。

4

2 回答 2

0

我无法解释数字的打印顺序。但是从我阅读您的代码的方式来看,您继续在文件中找到的下一个数字下方构建树。因此,每个数字将只填充一个分支(低或大)。但是,如果当前数字大于前一个数字,而下一个数字小于当前数字,那么下一个数字也可能小于前一个数字。如果您仍然关注我,并且如果我是正确的,那么您应该始终从树的顶部输入一个新数字,然后在每个节点处沿着树向下(它更大还是更低?)直到正确的位置找到数字(没有更大或更低)并填写(大或低)。

谷歌搜索了一下: http: //mypascalbook.blogspot.com/2009/11/14-pointer-basics-binary-tree-lists-in.html

于 2013-09-15T01:04:35.037 回答
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 > 50 ,所以我通过我的右节点作为发送 p+1 where val(p+1) = 70(这需要插入)。所以,现在我的树是 . 50 作为 root ,在右节点上有 70。但是当前节点指向 70。现在当您比较下一个元素,即 30 时,您检查它是否小于 70 并将其插入到 70 的左侧。实际上,在那个点上,它应该已经插入在节点的左侧,值为 50。您正在制作的结构不是一棵树,它是一种高度为 n 的锯齿形。

于 2013-09-15T06:26:55.733 回答