Pointers Pascal将递归更改为带指针的while循环

Pointers Pascal将递归更改为带指针的while循环,pointers,recursion,while-loop,pascal,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

嗨,我正在学习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;
        if KEY < NODE^.KEY then
            NODE:=NODE^.LEFT
        else
            NODE:=NODE^.RIGHT
过程插入(键:整数;变量节点:NODEPTR);
开始
如果NODE=Nil,则
开始
新建(节点);
节点^.KEY:=键;
节点^.LEFT:=Nil;
节点^.RIGHT:=Nil
结束
其他的
如果键
我要做的是将递归函数改为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;
过程插入(键:整数;变量节点:NODEPTR);
开始
而节点nil do
开始
如果键
当第一个节点为root时,while循环为true并执行此代码 但在此之后,while循环变为false并创建一个新节点

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;
        if KEY < NODE^.KEY then
            NODE:=NODE^.LEFT
        else
            NODE:=NODE^.RIGHT
如果键
最终没有节点连接,该程序只是继续创建新节点。
有什么我错过的吗?或者对第二条代码有什么即兴创作?
提前感谢:)

您错过的是您从未链接节点(在当前设置中,您实际上无法链接节点)。在节点的左侧和右侧节点的记录中有字段,但没有分配它们。因此,您最终只是创建节点,而没有将它们链接起来;您有一个缺少链接的链接列表

在某一点上,您将需要一些类似于
NODE^.右:=NEWNODE
(或者
NODE^.左:=NEWNODE
,当然)

你需要一些东西(我的Pascal有点生疏,所以要小心语法错误;):

过程插入(键:整数;变量节点:NODEPTR)
开始
NODEPTR root:=节点;
如果(键
在上面的例子中有很多改进和美化,但我认为它显示了总体思路