Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Data structures 未排序数组的二叉树_Data Structures_Binary Tree_Pascal - Fatal编程技术网

Data structures 未排序数组的二叉树

Data structures 未排序数组的二叉树,data-structures,binary-tree,pascal,Data Structures,Binary Tree,Pascal,我有一个记录数组,我正试图从中构造一个二叉树。 最终结果如下-1表示null,如果左指针和右指针都是-1,则它是叶节点 | Index | Left Pointer | Data | Right Pointer | |:-----:|:------------:|:----:|:-------------:| | 0 | 1 | 17 | 4 | | 1 | 2 | 8 | 3

我有一个记录数组,我正试图从中构造一个二叉树。 最终结果如下-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.
类型节点=记录
数据:字符串;
左:整数;
右:整数;
终止
变量
binaryTree:节点的数组[0..9];
程序输出;
变量
i:整数;
开始
对于i:=0到9 do
开始
writeln('Data:',二进制树[i].Data);
writeln('Left:',binaryTree[i].Left);
writeln('Right:',binaryTree[i].Right);
终止
终止
程序输入;
变量
i:整数;
开始
对于i:=0到9 do
readln(二进制树[i].数据);
终止
程序初始化指针;
变量
i:整数;
开始
//初始化为-1表示为空
对于i:=0到9 do
开始
二叉树[i]。左:=-1;
二叉树[i]。右:=-1;
终止
终止
程序设置指针;
变量
i:整数;
根,当前节点:节点;
开始
//第一个值成为根
根:=二叉树[0];
对于i:=1到9 do
开始
currentNode:=根节点;
尽管如此
开始
如果binaryTree[i].data=currentNode.data,则
开始
如果currentNode.right=-1,则
开始
currentNode.right:=i;
打破
终止
其他的
currentNode:=二进制树[currentNode.right]
终止
终止
终止
终止
终止
开始
接受输入;
初始指针;
设定指针;
输出
终止

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

在Pascal中,记录是值类型,所以当您这样做时,例如

root:=binaryTree[0]

然后
root
binaryTree[0]
的副本

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

如果要将所选更改反映回
binaryTree
数组中,则必须在使用后重新赋值:

binaryTree[0]:=root


或者,使用指针,但我不确定您是否已经了解了这些内容。

谢谢,我现在明白了问题所在。但是你能指出我需要在哪里添加这个吗?修复当前代码的最简单方法可能是在
设置指针中消除局部变量
当前节点
。相反,使用
binaryTree
中的索引。