免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: converse
打印 上一主题 下一主题

[算法] <<算法导论>>一起学之二:红黑树的实现C源码 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2007-11-28 21:44 |只看该作者
看到红黑树就头大~~~~

论坛徽章:
0
22 [报告]
发表于 2007-11-28 21:47 |只看该作者
好像所有的平衡二叉树的删除操作都很麻烦~~~~~

论坛徽章:
0
23 [报告]
发表于 2007-11-29 09:59 |只看该作者
  哈哈,跟你一起看,不懂就骚扰你

论坛徽章:
0
24 [报告]
发表于 2008-03-07 11:30 |只看该作者

  1. /*-----------------------------------------------------------
  2. |        函数作用:查找key值对应的结点指针
  3. |        输入参数:根节点root,待查找关键值key
  4. |        返回参数:如果找到返回结点指针,否则返回NULL
  5. -------------------------------------------------------------*/
  6. PRBTree Find_Node(PRBTree root, KEY key)
  7. {
  8.         PRBTree x;

  9.         // 找到key所在的node
  10.         x = root;
  11.         do
  12.         {
  13.                 if (key == x->key)
  14.                         break;
  15.                 if (key < x->key)
  16.                 {
  17.                         if (NULL != x->left)
  18.                                 x = x->left;
  19.                         else
  20.                                 break;
  21.                 }
  22.                 else
  23.                 {
  24.                         if (NULL != x->right)
  25.                                 x = x->right;
  26.                         else
  27.                                 break;
  28.                 }
  29.         } while (NULL != x);

  30.         return x;
  31. }
复制代码


对于这一段:我有点疑问
按你的要求是否应该是这样:


  1. /*-----------------------------------------------------------
  2. |        函数作用:查找key值对应的结点指针
  3. |        输入参数:根节点root,待查找关键值key
  4. |        返回参数:如果找到返回结点指针,否则返回NULL
  5. -------------------------------------------------------------*/
  6. PRBTree Find_Node(PRBTree root, KEY key)
  7. {
  8.         PRBTree x;

  9.         // 找到key所在的node
  10.         x = root;
  11.         do
  12.         {
  13.                 if (key == x->key)
  14.                         break;
  15.                 if (key < x->key)
  16.                 {                    
  17.                        x = x->left;                     
  18.                 }
  19.                 else
  20.                 {
  21.                        x = x->right;                  
  22.                 }
  23.         } while (NULL != x);

  24.         return x;
  25. }
复制代码

  1.     10              
  2.    / \            
  3.   5   15  
  4. / \               
  5. 3   6   
复制代码

假如你要找4,当x指向3的时候,你直接判断其右结点为null, 结果你直接break了,那么这个时候x指向的是3,实际上应该返回的是null.

论坛徽章:
0
25 [报告]
发表于 2008-03-11 11:23 |只看该作者

  1. 3)空节点是黑色的(红黑树中,根节点的parent以及所有叶节点lchild、rchild都不指向NULL,而是指向一个定义好的空节点)。

  2.   // 设置z的左右子树为空并且颜色是red,注意新插入的节点颜色都是red
  3.         z->parent = y;   
  4.         z->left = z->right = NULL;
  5.         z->color = RED;
复制代码


看了半天,感觉第3条你没有实现
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP