嗨,我正在学习pascal并测试一些功能 我做了一个像这样的递归插入程序。 如果节点存在比较两个键,如果不存在,则为新节点腾出空间。
procedure INSERT (KEY : integer; var NODE : NODEPTR);
begin
if NODE = Nil then
begin
New (NODE);
NODE^.KEY := KEY;
NODE^.LEFT := Nil;
NODE^.RIGHT := Nil
end
else
if KEY < NODE^.KEY then
INSERT (KEY, NODE^.LEFT)
else
INSERT (KEY, NODE^.RIGHT)
end;
而我正在尝试将递归函数更改为while循环。
所以我做了这样的程序
如果节点存在则执行while循环直到节点为空。
在while循环结束后,创建一个新节点
procedure INSERT (KEY : integer; var NODE : NODEPTR);
begin
while NODE <> nil do
begin
if KEY < NODE^.KEY then
NODE:=NODE^.LEFT
else
NODE:=NODE^.RIGHT
end;
New (NODE);
NODE^.KEY := KEY;
NODE^.LEFT := Nil;
NODE^.RIGHT := Nil
end;
当第一个节点是root时,while循环为true并执行此代码 但在此之后,while循环变为false并创建一个新节点。
if KEY < NODE^.KEY then
NODE:=NODE^.LEFT
else
NODE:=NODE^.RIGHT
最终没有节点连接,这个程序只是不断创建新节点 有什么我错过的吗?或任何关于第二个代码的即兴创作? 提前谢谢:)
答案 0 :(得分:1)
您错过的是您从不链接节点(在当前设置中,您实际上无法链接节点)。您的记录中有节点的左侧和右侧节点的字段,但您不指定它们。所以你最终只是创建节点而不是每个都连接它们;你有一个缺少链接的链表。
有一点,你需要NODE^.RIGHT := NEWNODE
(当然还是NODE^.LEFT := NEWNODE
)。
你需要一些方法(我的Pascal有点生疏,所以要注意语法错误;)):
procedure INSERT(key: Integer; var NODE: NODEPTR)
begin
NODEPTR root := NODE;
if (key < root^.KEY) then begin
while (root^.LEFT <> nil) do begin
root := root^.LEFT;
end;
new(NODE);
NODE^.KEY := key;
root^.LEFT := NODE;
node^.RIGHT := root;
end else begin
while (root^.Right <> nil) do begin
root^ := root^.RIGHT;
end;
new(NODE);
NODE^.KEY := key;
root^.RIGHT := NODE;
NODE^.LEFT := root;
end;
end;
上面的例子中有很多改进和美化,但我认为它显示了一般的想法。