Pascal使用指针将递归更改为while循环

时间:2012-12-12 08:22:23

标签: pointers recursion while-loop pascal

嗨,我正在学习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

最终没有节点连接,这个程序只是不断创建新节点 有什么我错过的吗?或任何关于第二个代码的即兴创作? 提前谢谢:)

1 个答案:

答案 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;

上面的例子中有很多改进和美化,但我认为它显示了一般的想法。