【问题标题】:Red black tree comparison function [closed]红黑树比较功能
【发布时间】:2016-02-17 20:51:21
【问题描述】:

我在 C 中实现了一个红黑树。在 C++ 映射中,可以提供一个自定义比较,它只执行操作 value1

完整的代码不是必需的,因为它与所有其他树实现的代码相同。目前有如下比较功能:

int cmp(void *key1, void *key2){
  if(*(int*)key1 < *(int*)key2){
    return 1;
  }else if(*(int*)key1 > *(int*)key2){
    return -1;
  }else{
    return 0;
  }
}

我想要一个这样的比较函数:

int cmp(void *key1, void *key2){
  if(*(int*)key1 < *(int*)key2){
    return 1;
  }else{
    return 0;
  }
}

我不明白如何使用此比较功能进行搜索,因为找到节点时没有停止条件。

【问题讨论】:

  • “我在 C 中实现了一个红黑树。在 C++ 映射中......” - 那么它是哪种语言? C 和 C++ 是不同的语言!
  • 我的目的是查看 C++ stl 库以了解其工作原理。
  • 您还可以查看 Python 或 Fortran 库。但这并没有说明如何在 C 中实现它。而且 C 很好地确实具有比较运算符。要学习 C,请阅读 C 书籍,而不是 C++ 书籍或小说。如果您的 C 代码存在特定问题,请明确说明并提供minimal reproducible example

标签: c algorithm binary-search-tree red-black-tree


【解决方案1】:

你可以用严格的不等式来表达相等:

(a == b) <==> !(a < b || b < a)

等价假设比较关系是严格的全序。这是 C++ 比较类型所必需的,也是树实现中比较函数所必需的。

就你的二叉树搜索而言,看看第一个cmp是如何实现的。请注意它如何仅使用&lt; 找出何时返回 0。使用第二个cmp,您的实现可以做同样的事情。

【讨论】:

  • 当然,这假设&lt; 运算符描述了一个总排序。并非所有类型都提供这种排序,也不是所有&lt; 运算符都提供这种排序。另一方面,那些可能不应该在搜索树中使用。
  • @JohnBollinger 确实,我的回答假设了需要严格总排序的 C++ 比较类型的上下文。我将明确提及。
  • OP 似乎在 C 中重新实现。不确定他的问题是什么,因为他甚至没有显示代码。
  • @Olaf 我的理解是,Gustavo 是在询问当比较函数只做不等式时如何实现等式比较。
  • 查看他对另一个问题的评论。他似乎尝试使用 C++ 作为“模板”来学习 C。
猜你喜欢
  • 2015-03-06
  • 2011-02-15
  • 2015-08-06
  • 2010-09-06
  • 2017-03-02
  • 2022-01-15
  • 1970-01-01
  • 2011-02-04
  • 2018-10-10
相关资源
最近更新 更多