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

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) do begin
z:=y;
if (x^.data<y^.data) then y:=y^.left
else y:=y^.right;
end;
if (x^.data<z^.data) then z^.left:=x
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<y^.data) then y:=y^.left
else y:=y^.right;
exit(y);
end;

procedure del(x:point);
var
y,z:point;
begin
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;
z^.left:=y^.right;
end
else begin
y:=x;
x:=x^.left;
end;
dispose(y);
end;

procedure out(x:point);
begin
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);
end.

求各位大牛解答……

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<y^.data) then y:=y^.left
else y:=y^.right;
end;
if y<>nil then begin { 若x存在,不能插入 }
dispose(x);
exit;
end;
if (x^.data<z^.data) then z^.left:=x
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<y^.data) then y:=y^.left
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<q^.data) then q:=q^.left
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算法看了好一会儿才看懂,按你程序改好了,你把{......}中的注释看懂,就知道你的程序哪里错了。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-04-24
建议你写成静态的。动态的很难查错。
第2个回答  2012-04-21

学C语言的NOIP问题
1、排序算法(快排、选择、#冒泡、堆排序、*二叉排序树、桶排序)2、DFS\/BFS 也就是搜索算法,剪枝务必要学! 学宽搜的时候再复习一下哈希表3、树 ①遍历 ②二叉树 ③二叉排序树(查找、生成、删除) ④堆(二叉堆、堆排序) ⑤*Trie树 4、图(图论建模) ①最小生成树 ②最短路径 ③计算图的传递闭包 ④*连通...

高中信息学联赛经典题型(pascal)
2. 设有一棵k叉树,其中只有度为0和k两种结点,设n 0 ,n k ,分别表示度为0和度为k的结点个数,试求出n 0 和n k之间的关系(n 0 = 数学表达式,数学表达式仅含n k 、k和数字)。三.阅读程序,写出正确的程序运行结果:(8 + 9 + 9 = 26分)1. program Gxp1;var i , n...

我想参加noip,有没有从零开始的教材。pascal 怎么学才能够格参赛?_百 ...
还有排序算法:冒泡排序,选择排序,插入排序,快速排序,堆排序,希尔排序,基数排序,序数排序,桶排序,鸽巢排序,二叉树排序(应用二叉排序树),鸡尾酒排序(就是双向冒泡,在一次初赛的完善程序里出现过)还有数论算法(不展开介绍了)图论算法:最短路(顾名思义,就是一个点到另一个点的最短路程...

...嵌入式软件应用专业的研究生,请问:该专业课是国家命题,还是学校自主...
2.请画出下面的树所对应的二叉树。3.从一棵空的二叉排序树开始,将以下关键码值依次插入:25,13,15,31,7,20,37,请画出插入全部完成后的二叉排序树。4.请画出下面带权图的一棵最小生成树。5.对于下面的稀疏矩阵 1)画出其三元组法存储表示。2)画出其行—列法(十字链表法)存储表示。五...

全国计算机等级考试三级分几类?
7.检索的基本概念与检索算法(顺序检索,二分检索,散列支术索,二叉排序树)。 三、操作系统 1.操作系统的功能、类型,多用户操作系统。 2.进程及线程的概念,进程间的通信,进程管理,作业调度,作业控制,死锁。 3.页式、段式、段页式存储,虚拟存储原理,地址转换机制,页面淘汰算法。 4.文件和文件系统的概念,文件控制...

相似回答
大家正在搜