免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1806 | 回复: 5
打印 上一主题 下一主题

请教一行程序(红黑树删除) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-15 15:06 |只看该作者 |倒序浏览
此函数是红黑树的删除实现,tree->parents的类型是TREE_ELEMENT **parents[n],TREE_ELEMENT为树种节点的类型。

int tree_delete(TREE *tree, void *key, uint key_size, void *custom_arg)
{
  int cmp,remove_colour;
  TREE_ELEMENT *element,***parent, ***org_parent, *nod;
  if (!tree->with_delete)
    return 1;                                        /* not allowed */

  parent= tree->parents;
  *parent= &tree->root; element= tree->root;
  for (;
  {
    if (element == &tree->null_element)
      return 1;                                /* Was not in tree */
    if ((cmp = (*tree->compare)(custom_arg, ELEMENT_KEY(tree,element),
                                key)) == 0)
      break;
    if (cmp < 0)
    {
      *++parent= &element->right; element= element->right;
    }
    else
    {
      *++parent = &element->left; element= element->left;
    }
  }
  if (element->left == &tree->null_element)
  {
    (**parent)=element->right;
    remove_colour= element->colour;
  }
  else if (element->right == &tree->null_element)
  {
    (**parent)=element->left;
    remove_colour= element->colour;
  }
  else
  {
    org_parent= parent;
    *++parent= &element->right; nod= element->right;
    while (nod->left != &tree->null_element)
    {
      *++parent= &nod->left; nod= nod->left;
    }
    (**parent)=nod->right;                /* unlink nod from tree */
    remove_colour= nod->colour;
    org_parent[0][0]=nod;                /* put y in place of element */
    org_parent[1]= &nod->right;//这一行是什么意思啊?干什么用的啊?谢谢
    nod->left=element->left;
    nod->right=element->right;
    nod->colour=element->colour;
  }
  if (remove_colour == BLACK)
    rb_delete_fixup(tree,parent);
  if (tree->free)
    (*tree->free)(ELEMENT_KEY(tree,element), free_free, tree->custom_arg);
  tree->allocated-= sizeof(TREE_ELEMENT) + tree->size_of_element + key_size;
  my_free(element);
  tree->elements_in_tree--;
  return 0;
}

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
2 [报告]
发表于 2012-06-15 17:59 |只看该作者
你是哪家公司的?还是在读书???

论坛徽章:
0
3 [报告]
发表于 2012-06-15 18:06 |只看该作者
回复 1# keithnwsuaf_cu


    找《算法导论》看看,时间久了,忘记了

论坛徽章:
0
4 [报告]
发表于 2012-06-15 22:03 |只看该作者
这个和公司应该没有关系吧?

算法导论看了,我感觉那一行逻辑上不对。org_parent[0][0]=nod;已经使nod节点取代了要删除到节点

论坛徽章:
0
5 [报告]
发表于 2012-06-15 22:18 |只看该作者
本帖最后由 comoon 于 2012-06-15 22:23 编辑

回复 4# keithnwsuaf_cu


    你看的是中文的?第几版的?中文的翻译印刷错误较多。。。。最好看英文版的,而且那书1 。2版上确实有些错误,3纠正了很多!你找本英文3版的再看看吧!

   而且你那代码应该不是书上的吧,算法导论上面的代码都是逻辑代码,没有具体到语言实现的。。。你那明显是C。。。

论坛徽章:
0
6 [报告]
发表于 2012-06-18 10:49 |只看该作者
谢谢楼上,翻译书害人啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP