我是大甲鱼 发表于 2018-9-8 11:58:52

数据结构第七十五讲,顺序树的删除问题

Status DeleteBST(BiTree *T, int key)
{
    if( !*T )
    {
      return FALSE;
    }
    else
    {
      if( key == (*T)->data )//如果找到关键字执行Delete
      {
            return Delete(T);
      }
      else if( key < (*T)->data )
      {
            return DeleteBST(&(*T)->lchild, key);
      }
      else
      {
            return DeleteBST(&(*T)->rchild, key);
      }
    }
}

Status Delete(BiTree *p)
{
    BiTree q, s;
   
    if( (*p)->rchild == NULL )   //如果没有右孩子
    {
      q = *p;                                        // 这一步,q *p是目标节点的地址
      *p = (*p)->lchild;                //这一步,*p变成目标节点左孩子的地址,则代替目标点成为双亲的左孩子
      free(q);                                //释放原来目标节点的地址
    }
    else if( (*p)->lchild == NULL )
    {
      q = *p;
      *p = (*p)->rchild;
      free(q);
    }
    else
    {
      q = *p;
      s = (*p)->lchild;//s=目标data节点的左孩子左子树
      
      while( s->rchild )        //while 寻找目标节点左子树的最大值s   q是最大值data的双亲
      {
            q = s;                //s的双亲
            s = s->rchild;
      }
      
      (*p)->data = s->data;//目标点的data等于目标节点子树的最大data
      
      if( q != *p )//这里到free那里不是很懂。另外我的注释有错么?   
      {
            q->rchild = s->lchild;
      }
      else
      {
            q->lchild = s->lchild;
      }
      
      free(s);
    }
   
    return TRUE;
}



这儿没看懂


      if( q != *p )//
      {
            q->rchild = s->lchild;
      }
      else
      {
            q->lchild = s->lchild;
      }

claws0n 发表于 2018-9-8 13:11:38

前面的注释可以,但应该是用 q 把删除目标给复制一份,然后在删除目标只有单一孩子的情况下,让其孩子替代自己,才来删除。
40 多标注 //如果删除目标有两个孩子,寻找直接前驱。这里用的是左孩子的最大元素。

42、43 的作用?
45 能解释一下吗?为什么可以找到左子树的最大值?这样的注释你能理解?
47 你确定吗?
51 为什么要这样做?
先了解到这里

我是大甲鱼 发表于 2018-9-8 13:45:40

claws0n 发表于 2018-9-8 13:11
前面的注释可以,但应该是用 q 把删除目标给复制一份,然后在删除目标只有单一孩子的情况下,让其孩子替代 ...

42 的作用是将目标节点备份
43 的作用是让s指向目标节点的左孩子,然后以这个左孩子做root,一直往右边寻找最大值
45一直往右遍历寻找最大值
47 当s等于最大值的时候把s备份到q,然后s->rchild==null就开始跳出循环
51 的作用就是把在目标点的左子树找到的最大值赋值给这个目标点,就相当于把这个目标点的data删除了
53 的意思是什么? *p是目标节点的地址,从else到这里一直没变过,p是目标点左子树找到的最大值节点地址。合起来的意思就是,目标节点和左子树最大节点不是同一个点?这句不是很理解

claws0n 发表于 2018-9-8 14:19:51

我是大甲鱼 发表于 2018-9-8 13:45
42 的作用是将目标节点备份
43 的作用是让s指向目标节点的左孩子,然后以这个左孩子做root,一直往右边 ...

42 不要看到【等于】就是备份(虽然系统内部确实是复制了一份),初始化而已,让 53 用。
43 换一个角度,s 是 p 的左孩子,有时候需要,有时候不需要,只是用指来指去的,会有盲点,个人看法。
45这是一个循环,应该是【找到叶子节点】
47 循环体内部,所以应该把循环条件也说一下。s 的右孩子不为空的情况下,q 指向了 s,然后 s 指向了自己的右孩子。当找到叶子节点,即待删除目标的直接前驱,跳出循环。
51 将待删除目标的资料覆盖为它的直接前驱的资料-> 62 删除直接前驱。

在特殊情况下,45 失败了,即 p 的左孩子(s)没有右孩子。此时 q == *p。因为被删除的是 s 。所以把 s 的左孩子给了 q ,即给 p。
如果 45 成功,q != *p,但是要检查 s 是否有右孩子,一样进行维护。

最后释放叶子节点

我是大甲鱼 发表于 2018-9-8 15:02:27

claws0n 发表于 2018-9-8 14:19
42 不要看到【等于】就是备份(虽然系统内部确实是复制了一份),初始化而已,让 53 用。
43 换一个角度 ...

嗯 知道了 。华硕以前数据结构不是有经典面试题 部分吗 ,怎么没看到了

claws0n 发表于 2018-9-8 15:10:58

我是大甲鱼 发表于 2018-9-8 15:02
嗯 知道了 。华硕以前数据结构不是有经典面试题 部分吗 ,怎么没看到了

不知道 {:5_96:}
论坛的就只有这些
https://fishc.com.cn/forum.php?mod=forumdisplay&fid=233&filter=typeid&typeid=336

我是大甲鱼 发表于 2018-9-8 15:27:27

claws0n 发表于 2018-9-8 15:10
不知道
论坛的就只有这些
https://fishc.com.cn/forum.php?mod=forumdisplay&fid=233&filter= ...

表示学数据结构很是痛苦,为什么面试要考这东西

claws0n 发表于 2018-9-8 15:48:30

我是大甲鱼 发表于 2018-9-8 15:27
表示学数据结构很是痛苦,为什么面试要考这东西

哥哥学得很痛苦吗?还有 24,加油{:5_108:}
会数据结构感觉好像很牛逼、很厉害思考、很会解问题……么么
面试问这些,测试员工如何思考{:9_227:}

我是大甲鱼 发表于 2018-9-8 16:41:12

claws0n 发表于 2018-9-8 15:48
哥哥学得很痛苦吗?还有 24,加油
会数据结构感觉好像很牛逼、很厉害思考、很会解问题……么么 ...

{:10_266:}还有十二天,准备出去投简历了
页: [1]
查看完整版本: 数据结构第七十五讲,顺序树的删除问题