在树根结点指针为r的二叉查找(排序)树上删除键值为e的结点

来源:互联网 发布:数据生产平台 编辑:程序博客网 时间:2024/03/29 00:48

鲁班软件笔试时的题目,后来搜了下,发现是软设的题。

转自:http://hi.baidu.com/mqgw/blog/item/cade830f1894222c6159f36c.html

转自:http://www.examda.com/soft/Programmer/060124/091040110-2.html

 

函数DeleteNode(Bitree *r,int e)的功能是:在树根结点指针为r的二叉查找(排序)树上删除键值为e的结点,若删除成功,则函数返回0,否则函数返回-1。二叉查找树结点的类型定义为:
typedef struct Tnode{
  int data;

      struct Tnode *Lchild,*Rchild;  

     }*Bitree;
在二叉查找树上删除一个结点时,要考虑三种情况:
1. 若待删除的结点p是叶子结点,则直接删除该结点;
2. 若待删除的结点p只有一个子结点,则将这个子结点与待删除结点的父结点直接连接,然后删除结点p;
3. 若待删除的结点p有两个子结点,则在其左子树上,用中序遍历寻找关键值最大的结点s,用结点s的值代替结点p的值,然后删除结点s,结点s必属于上述○1、○2情况之一。


int DeleteNode(Bitree *r,int e) {
  Bitree p = *r, pp, s, c;
  while (p&&p->data !=e)

            { /*从树根结点出发查找键值为e的结点*/
           pp = p;

               if ( e< p->data)

                   p = p -> Lchild;
           else

                   p = p->Rchild;

              }
  if (!p) return –1; /* 查找失败 */
  if (p->Lchild && p->Rchild)

      { /* 处理情况3 */
   s = p->Lchild;

         pp = p;
   while (s->Rchild)

               {

                  pp = s;

                  s = s-> Rchild;

                }
   p->data = s ->data;

         p = s;

       }
  /* 处理情况○1、○2*/
  if (p->Lchild )

           c = p -> Lchild;

      else

           c = p -> Rchild;
  if (p == *r)

            *r = c;
  else

          if (p==pp->Lchild )

               pp -> Lchild = c;
  else

           pp->Rchild = c;
  free(p);

      return 0;

      }

原创粉丝点击