首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

查找二叉树如何删除节点

2013-01-02 
查找二叉树怎么删除节点左右节点都存在的情况下语言描述 不要代码[解决办法]分多种情况讨论1.被删除节点没

查找二叉树怎么删除节点
左右节点都存在的情况下

语言描述 
不要代码
[解决办法]
分多种情况讨论
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;
    }
  }
}

热点排行