- 论坛徽章:
- 1
|
算法求助!
void delnote(bstree *bt,bstree p,bstree q) // q 是p的父结点,p是要 删结点
{
bstree s,r;
if(p->;lchild == NULL) //左子树为空
{
if(p == *bt) //不是用形参给出p的父接点了吗?怎么还要判断?思路不清晰。
*bt = p->;rchild;
else if (q->;lchild == p )
q->;lchild = p->;rchild;
else
q->;rchild = p->;rchild;
}
else if (p->;rchild == NULL) //右子树为空
{
if(p == *bt)
*bt = p->;lchild;
else if(q->;lchild == p)
q->;lchild = p->;lchild;
else
q->;rchild = p->;lchild;
}
else <----- 因该是这里错了
{
s = p;
r = s->;rchild;
while(r->;lchild != NULL) //找最左结点 *r,*s是 *r的父结点
{
s =r;
r = r->;lchild;
}
r->;lchild = p->;lchild;
if(p!=s)
{
r->;lchild = p->;lchild; //同上面的语句重复。
r->;rchild = p->;rchild;
}
if(p == *bt)
*bt = r; //此处应该删除原先r的父接点指向r的指针。否则会多出这样一条线。
else if(q->;lchild== p) //删除的是q的左孩子
q->;lchild =r; //这里p的右子树怎么办?被整个砍下去了。
else
q->;rchild = r; //删除的是q的右孩子
//同样,p的左子树呢?
}
free(p);
}
问题写在上面的注释里了。
应该去找本数据结构的书好好看看。p删除后,p的左右子树不同的安排方法应该有不同的删除方法。
还有,写程序应该有一定的缩进,有层次感以增加程序的可读性。
前面,p只有一个子树的时候,删除写得不错。p有两个子树的时候就糊涂了,在“画图”里画一画就明白了。 |
|