来自未排序数组的二叉树

时间:2018-10-25 16:41:24

标签: data-structures binary-tree pascal

我有一组记录,试图从中构造出一个二叉树。 最终结果应如下。 -1表示null,并且如果左右两个指针均为-1,则它是叶节点。

| Index | Left Pointer | Data | Right Pointer |
|:-----:|:------------:|:----:|:-------------:|
|   0   |       1      |  17  |       4       |
|   1   |       2      |   8  |       3       |
|   2   |      -1      |   4  |       7       |
|   3   |      -1      |  12  |       6       |
|   4   |       5      |  22  |       8       |
|   5   |      -1      |  19  |       -1      |
|   6   |      -1      |  14  |       -1      |
|   7   |      -1      |   5  |       -1      |
|   8   |       9      |  30  |       -1      |
|   9   |      -1      |  25  |       -1      |

这是我当前的代码:

type node = record
    data : string;
    left : integer;
    right : integer;
end;

var
  binaryTree : array[0..9] of node;

procedure output;
var
    i : integer;
begin
    for i := 0 to 9 do
    begin
        writeln('Data: ' , binaryTree[i].data);
        writeln('Left: ' , binaryTree[i].left);
        writeln('Right: ' , binaryTree[i].right);
    end;
end;

procedure takeInput;
var
    i : integer;
begin
    for i := 0 to 9 do
        readln(binaryTree[i].data); 
end;

procedure initialisePointers;
var 
    i : integer;
begin
    // initialise to -1 for null
    for i := 0 to 9 do
    begin
        binaryTree[i].left := -1;
        binaryTree[i].right := -1;
    end;
end;

procedure setPointers;
var
    i : integer;
    root, currentNode : node;
begin
    // first value becomes root
    root := binaryTree[0];
    for i := 1 to 9 do
    begin
        currentNode := root;
        while true do
        begin
            if binaryTree[i].data < currentNode.data then
            begin
                if currentNode.left = -1 then
                begin
                    currentNode.left := i;
                    break;
                end
                else
                    currentNode := binaryTree[currentNode.left]
            end
            else
            begin
                if binaryTree[i].data >= currentNode.data then
                begin
                    if currentNode.right = -1 then
                    begin
                        currentNode.right := i;
                        break;
                    end
                    else
                        currentNode := binaryTree[currentNode.right]
                end;
            end;
        end;
    end;
end;

begin
    takeInput;
    initialisePointers;
    setPointers;
    output;
end.

使用表中所示的输入,我得到了初始化时所有指针保持为-1的输出。知道为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

在Pascal中,记录是值类型,因此当您进行操作时,例如

root := binaryTree[0];

然后,rootbinaryTree[0]副本

root中设置字段时,就是在副本中设置字段。

如果您想选择反映在binaryTree数组中的更改,则必须在使用后将其分配回值:

binaryTree[0] := root;

否则,请使用指针,但是我不确定您是否已经了解了这些指针。