加载树并按升序打印

时间:2013-09-14 20:49:25

标签: 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
          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.

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

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

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

2 个答案:

答案 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的之字形。