二叉排序树删除结点的方法

go_Michael go_Michael 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

//数据结构与算法分析
void remove(const Type& x,BinaryNode*& p)
{
if(t == NULL)
return;
if(x < t->element)
remove(x,t->left);
else if(x > t->element)
remove(x,t->right);
else if(t->left != NULL && t->right !=NULL)
{
t->element=findMin(t->right)->element;
remove(t->element,t->right);
}
else
{
BinaryNode* oldNode = t;
t=(t->left != NULL) ? t->left : t->right;
delete oldNode;
}
}
BinaryNode* findMin(BinaryNode* t)
{
if(t!=NULL)
while(t->left!=NULL)
t=t->left;
return t;
}

//以下是课本上的
void remove(BinaryNode* t)
{
if(!p->rchild)
{
q=p;
p=p->lchird;
free(q);
}
else if(!p->lchild))
{
q=p;
p=p->right;
free(q);
}
else //左右子树均不空
{
q=p;
s=p->lchild;
while(s->right) //转左,然后向右到尽头
{
q=s;
s=s->rchild; //s指向被删除结点的前驱;
}
p->element=s->element;
if(q!=p) //重接*q右子树
q->rchild=s->lchild;
else //重接*q左子树
q->lchild=s->lchild;
delete s;
}
}

如下二叉排序树所示
6

2 8

1 5

3

4
如果要删除结点2的话 两种算法得到的结果不一样
第一种:
6

3 8

1 5

4

课本上的做了之后这样:
6

1 8

5

3

4

大家看看有什么问题
...全文

相关推荐

评论 5
收藏 已收藏
分享
返回顶部
go_Michael
C++ 语言 65,214 成员 250,514 内容