我正在尝试实现二叉搜索树,我需要一个函数来告诉我树中是否已存在元素! 但是,我可以使用的唯一操作符是< 。 这甚至可能吗?
我已经
已尝试(a<b) || (b<a)
和!(a<b) && !(b<a)
注意:我只允许使用&lt; 来比较二叉树中的元素。
答案 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
,
这是因为存在一个名为“部分订购”的概念,在特殊情况下,它可能允许两个对象可以有条件地相互排序的情况。
作为一个例子,考虑一个描述类继承的图。我们可以定义以下规则:
A
和B
描述同一个班级,则A
等于班级B
。A
是B
的超类,或者是A
的超类的超类,则B
大于类B
(等等) B
继承自A
,或B
继承自C
等继承自A
。A
是B
的子类(A
继承自B
或{{},则A
小于班级B
1}}继承自A
等继承自C
。B
与<{strong>>类A
无关,如果它们彼此无关(B
不从{{1}继承},A
不会继承自B
)B
如果它们都继承自同一个超类,则不会针对类A
进行排序,但是没有关系(A
继承自B
,A
继承自C
)B
如果它们是从同一个子类相互继承,则不会对类C
进行排序,但是没有关系(A
继承来自B
和C
)考虑到以下功能,这完全可信:
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
实施。
!(a < b || b < a)
存在符合IEEE标准的浮点值,其中!(a < b || b < a)
和operator==
都可以归还假。如果NaN
和a < b
都是b < a
,a == b
也会返回false,即使两个a
值都具有相同的有效负载!此外,对于两个赞美表示中的整数,此关系仅保证, C ++标准不需要。
答案 2 :(得分:1)
您正在寻找的表达方式是:
!(a < b || b < a)
相当于:
!(a < b) && !(b < a)
因为Boolean algebra和logical 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语句。 {}不仅仅需要()
,这只是为了使评估的顺序更加明显。