查找二叉树怎么删除节点

tiancai110a 2012-09-21 01:54:25
左右节点都存在的情况下

语言描述
不要代码
...全文
1769 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
耶鲁於 2014-10-25
  • 打赏
  • 举报
回复
个人感觉三楼的方法很合理,画一棵树出来再看,一目了然。
tiancai110a 2012-11-27
  • 打赏
  • 举报
回复
答案应该是 遍历左子树找到最大的节点(即左子树最右边的那个节点)或者右子树最小的节点替(即右子树最左边的节点)替换该节点,然后删除那个末端节点,即为了保持原有性质不变
windmissing 2012-09-26
  • 打赏
  • 举报
回复
(1)设要删除的结点是x,x有两个孩子的情况
step1:找到结点x的后继y,可知:y是x右子树中最左结点,且y没有左孩子
step2:把y的关键字给x,即让结点x成为结点y
step3:删除y,因为y没有左孩子,所以按照(2)的方法删除y
(2)设要删除的结点是y,y没有左孩子情况
若y没有右孩子,则直接删除y
若y有右孩子,设y的右孩子为z,y的父结点为p,则让z成为p的孩子,并删除y
palm008 2012-09-26
  • 打赏
  • 举报
回复
分如下几步:代码可以看我的共享
1.删除时只考虑删除,并标记平衡因子
2.根据平衡因子旋转树(这个比较复杂)
xiguaxue 2012-09-22
  • 打赏
  • 举报
回复
分多种情况讨论
1.被删除节点没有子树的情况,直接删除,并修改对应父节点的指针为空。
2.对于只有一个子树的情况,考虑将其子树作为其父节点的子树,关于是左还是右,根据被删除的节点确定。
3.最复杂的是有两个子数的情况,可以考虑两种方法,都是同样的思想:用被删除节点A的左子树的最右节点或者A的右子树的最左节点作为替代A的节点,并修改相应的最左或最右节点的父节点的指针,修改方法类似2
/**********删除二叉树节点的操作***********/
btree deletenode(btree root,int node)
{
btree parent;
btree point;
btree child;
int postion;

parent=binary_search(root,node,&postion);
//二叉树为空的情况
if(parent==NULL)
return root;
else
{
switch(postion)
{ case -1:point=parent->left;break;
case 1 :point=parent->right;break;
case 0 :point=parent;break;
}
if(point->left==NULL&&point->right==NULL)
{
switch(postion)
{
case -1:parent->left=NULL;break;
case 1:parent->right=NULL;break;
case 0:parent=NULL;break;
}
free(point);
return root;
}
if(point->left==NULL&&point->right!=NULL)
{
if(postion==-1)
parent->left=point->right;
else
if(postion==1)
parent->right=point->right;
else
root=root->right;
free(point);
return root;
}

if(point->left!=NULL&&point->right==NULL)
{
if(postion==-1)
parent->left=point->left;
else
if(postion==1)
parent->right=point->left;
else
root=root->left;
return root;
}
if(point->left!=NULL&& point->right!=NULL)
{
parent=point;
child=point->left;
while(child->right!=NULL)
{
parent=child;
child=child->right;
}
point->data=child->data;
if(parent->left=child)
parent->left=child->left;
else
parent->right=child->left;
free(child);
return root;
}
}
}
mkcing 2012-09-22
  • 打赏
  • 举报
回复
1,找到其后继,处理后继右子树
2,用后继代替
mkcing 2012-09-22
  • 打赏
  • 举报
回复
1,找到这节点的后继,先处理后继的右子树,后继没有左子树
2,用后继代替这个要删除的节点

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧