Data structures 未排序数组的二叉树
我有一个记录数组,我正试图从中构造一个二叉树。 最终结果如下-1表示null,如果左指针和右指针都是-1,则它是叶节点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
| 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
中的索引。