c语言二叉查找树怎么删除结点,二叉树删除节点的有关问题

本文探讨了二叉树删除节点的代码实现,原始代码在删除非根节点时,根据父节点的左右子节点进行操作。在修改后的代码中,尝试直接通过`look.child`调用删除函数导致了程序错误。问题在于`look.child`并不总是指向要删除节点的父节点指针成员,从而影响了指针的正确更新。这说明在处理二叉树删除时,必须确保传递的是目标节点的父节点指针成员的地址,以维持树结构的正确性。
摘要由CSDN通过智能技术生成

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

以下是二叉树删除节点的代码,C Primer Plus 第5版中的第17章的原代码

bool DeleteItem(const Item *pi,Tree *ptree)

{

Pair look;

look=SeekItem(pi,ptree);

if(look.child==NULL)

return false;

if(look.parent==NULL) /*删除根项目 */

DeleteNode(&ptree->root);

else if(look.parent->left==look.child)

DeleteNode(&look.parent->left);

else

DeleteNode(&look.parent->right);

ptree->size--;

return true;

}

static void DeleteNode(Node **ptr)

/*ptr 是指向目标节点的父节点指针成员的地址 */

{

Node *temp;

puts((*ptr)->item.petname);

if((*ptr)->left==NULL)

{

temp=*ptr;

*ptr=(*ptr)->right;

free(temp);

}

else if((*ptr)->right==NULL)

{

temp=*ptr;

*ptr=(*ptr)->left;

free(temp);

}

else /*被删成员有两个子节点 */

{

/*找到右子树的依附位置 */

for(temp=(*ptr)->left;temp->right!=NULL;temp=temp->right)

continue;

temp->right=(*ptr)->right;

temp=*ptr;

*ptr=(*ptr)->left;

free(temp);

}

}

Pair类型的声明如下:

typedef struct pair

{

Node *parent;

Node *child;

} Pair;

Node类型的声明如下:

typedef struct node{

Item item;

struct node *left;

struct node *right;

}Node;

我想问的问题是是在DeleteItem()函数中,删除节点调用的是DeleteNode(&look.parent->right)或(&look.parent->left),

而不直接调用(&look.child);将原代码中的DeleteItem()函数修改后如下:

bool DeleteItem(const Item *pi,Tree *ptree)

{

Pair look;

look=SeekItem(pi,ptree);

if(look.child==NULL)

return false;

if(look.parent==NULL) /*删除根项目 */

DeleteNode(&ptree->root);

else

DeleteNode(&look.child)

ptree->size--;

return true;

}

发现程序不能正确删除节点。调试过程中,发现DeleteNode()函数返回前,*ptr已经指向了他的一个子树,但是函数返回后,发现ptree里面对应的节点指向了一段乱码。&look.child和&look.parent->right(或left),应该都是一个二级指针,为什么传递&look.child会达不到和&look.parent->right(或left)一样的效果呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值