查找两个变量是否仅等于小于运算符

时间:2017-10-20 19:02:55

标签: c++ algorithm binary-tree binary-search-tree

我正在尝试实现二叉搜索树,我需要一个函数来告诉我树中是否已存在元素! 但是,我可以使用的唯一操作符是< 。 这甚至可能吗?

我已经 已尝试(a<b) || (b<a)!(a<b) && !(b<a)

注意:我只允许使用&lt; 来比较二叉树中的元素。

4 个答案:

答案 0 :(得分:4)

你可以用C ++编写

not ( a < b or b < a )

相当于

not ( a < b ) and not ( b < a )

虽然二进制搜索树不需要表达式,因为通常使用if_else语句就足够了

if ( a < b )
{
    // ...
}
else if ( b < a )
{
    //...
}
else /* a == b */
{
    //...
}

答案 1 :(得分:3)

operator<的实施,a == b

这是因为存在一个名为“部分订购”的概念,在特殊情况下,它可能允许两个对象可以有条件地相互排序的情况。

作为一个例子,考虑一个描述类继承的图。我们可以定义以下规则:

    如果AB描述同一个班级,则
  • 班级A等于班级B
  • 如果AB的超类,或者是A的超类的超类,则
  • B大于类B(等等) B继承自A,或B继承自C等继承自A
  • 如果AB的子类(A继承自B或{{},则
  • 班级A小于班级B 1}}继承自A等继承自C
  • B 与<{strong>>类A无关,如果它们彼此无关(B不从{{1}继承},A不会继承自B
  • B 如果它们都继承自同一个超类,则不会针对A进行排序,但是没有关系(A继承自BA继承自C
  • B 如果它们是从同一个子类相互继承,则不会对C进行排序,但是没有关系(A继承来自BC

考虑到以下功能,这完全可信:

A

在给定一些输入的情况下,输出可以是B

保证两个通用参数彼此相等的唯一方法是让std::string compare(T const& a, T const& b) { if(a == b) return "Equal to"; else if(a < b) return "Less than"; else if(a <= b) return "Less than or Equal to"; else if(a > b) return "Greater than"; else if(a >= b) return "Greater than or Equal to"; else return "Unordered to"; } 重载。

现在,对你来说好消息是,如果你正在构建一个二进制搜索树,那么有一个不成文的约定,用于比较的类型至少应该是弱有序的(这意味着{{1 }将返回与"Unordered to"相同的内容。因此,在您的特定情况下,只要提供的值排序较弱,operator== 将在对象相等时返回true。

但是你确实需要一些机制来确保用户不会尝试将部分有序的密钥传递给比较函数。否则,您将无法完成a==b实施。

PS:在有人跳入并说“算术类型怎么样?”之前,我会提醒您!(a < b || b < a)存在符合IEEE标准的浮点值,其中!(a < b || b < a)operator==都可以归还假。如果NaNa < b都是b < aa == b也会返回false,即使两个a值都具有相同的有效负载!此外,对于两个赞美表示中的整数,此关系仅保证 C ++标准不需要

答案 2 :(得分:1)

您正在寻找的表达方式是:

!(a < b || b < a)

相当于:

!(a < b) && !(b < a)

因为Boolean algebralogical operators 完整的例子:

#include <iostream>

int main() {
    int a = 2, b = 2;
    if (!(a < b || b < a)) {
        std::cout << "Are equal.";
    }
    else {
        std::cout << "Are not equal.";
    }
}

答案 3 :(得分:0)

作为一个例子,你可以像ints这样做:

bool isEqual(int a, int b)
{
    if((!(a < b)) && (!(b < a)))
       return true;
    return false
}

如果你不能使用偶数&&运算符,你可以嵌套if语句。 {}不仅仅需要(),这只是为了使评估的顺序更加明显。