请问这个二叉排序树的程序哪里出错了(pascal)

2024-12-30 03:41:41
推荐回答(3个)
回答1:

type
point=^node;
node=record
data:longint;
left,right:point;
end;

var
a:array[1..10] of longint;
x,i:longint;
cell,root:point;

procedure ins(x:point);
var
y,z:point;
begin
y:=root;
while (y<>nil) and ( x^.data<>y^.data ) do begin { 判断x是否存在 }
z:=y;
if (x^.data else y:=y^.right;
end;
if y<>nil then begin { 若x存在,不能插入 }
dispose(x);
exit;
end;
if (x^.data else z^.right:=x;
end;

function search(x:longint):point;
var
y:point;
begin
y:=root;
while (y<>nil) and (y^.data<>x) do
if (x else y:=y^.right;
search:=y; { }
end;

procedure del(x:point);
var
y,z,p,q:point;
begin
p:=nil; {p指向被删节点的双亲}
q:=root; {q指向被删节点}
while (q<>nil) and (q^.data<>x^.data) do begin
p:=q;
if (x^.data else q:=q^.right;
end;
if q=nil then exit; {如果x不存在,不能删除}
if (x^.right<>nil) then begin
y:=x^.right;
z:=x;
while (y^.left<>nil) do begin
z:=y;
y:=y^.left;
end;
x^.data:=y^.data;
if y^.data >= z^.data then { 要判断y^.right是链在左边还是在右边 }
z^.right:=y^.right
else
z^.left:=y^.right;
end
else begin
y:=x;
{注意,x^.left要链接到p的下方,p指向被删节点的双亲 }
if p=nil then root:=x^.left { 如果删除的是根节点 }
else if x^.data > p^.data then p^.right:=x^.left
else p^.left:=x^.left;
end;
dispose(y);
end;

procedure out(x:point);
begin
if x=nil then exit; {如果x为空,返回 }
if (x^.left<>nil) then out(x^.left);
write(x^.data,' ');
if (x^.right<>nil) then out(x^.right);
end;

begin
for i:=1 to 10 do read(a[i]);
new(root);
root^.data:=a[1];
root^.left:=nil;
root^.right:=nil;
for i:=2 to 10 do begin
new(cell);
cell^.data:=a[i];
cell^.left:=nil;
cell^.right:=nil;
ins(cell);
end;
randomize;
for i:=1 to 3 do begin
x:=random(10)+1;
cell:=search(a[x]);
if (cell<>nil) then del(cell);
end;
out(root);
writeln;
end.
以上是改好的程序,你的程序主要错误在删除(del)算法中,正常的删除算法不是你那样的,你那个del算法看了好一会儿才看懂,按你程序改好了,你把{......}中的注释看懂,就知道你的程序哪里错了。

回答2:

建议你写成静态的。动态的很难查错。

回答3: