2017-10-20 199 views
2

我試圖實現一個二叉搜索樹,我需要一個函數告訴我一個元素是否已經存在於樹中! 但是我唯一可以使用的運營商是<。 這甚至可能嗎?查找兩個變量是否等於只有小於運算符

我已經嘗試過 和(a<b) || (b<a)!(a<b) && !(b<a)

注:我只允許使用<比較我的元素二叉樹。

+1

你只能做兩件事:'a David

+2

[運算符<和嚴格弱排序]的可能重複(https://stackoverflow.com/questions/979759/operator-and-strict-weak-ordering) –

+1

如果兩個值中的任何一個都小於另一個,則它們必須是等於。 –

回答

4

你可以寫在C++

not (a < b or b < a) 

,對於二叉搜索樹的表達不會必需的,因爲它通常是足夠用了if_else之類的語句

相當於

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

雖然

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

這不能保證工作。看到我的答案。 – Xirema

+0

@Xirema沒有必要確切地等於浮點數。 –

+0

它仍然不能保證爲浮標工作。 'NaN'值可能導致'a Xirema

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."; 
    } 
} 
0

作爲一個例子,你可以爲ints這樣做:

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

如果您無法使用甚至&&運營商,你可以嵌套的if語句。還有更多() s,這只是爲了讓評估順序更加明顯。

+0

假設提供的'operator <'返回'bool'是安全的。在這種情況下,您可以使用'operator &&',因爲它已經很好地定義了'bool'。 –

3

無法保證,只給予operator<的執行,即a == b

這是因爲存在一個所謂的「偏序」的概念,這可能,異常情況下,允許這樣一個場景,兩個物體可以有條件下令反目成仇。

作爲示例,考慮描述類繼承的圖。我們可以定義以下規則:

  • A等於類B如果AB描述同一類。
  • AB類更大如果AB一個超類或是B或等類的超類的(從AB繼承,或B繼承CA繼承等)類的超類
  • A小於B類如果AB一個子類(從BA繼承,或從CB繼承等A繼承)
  • A不會相對於命令B類,如果它們沒有相對於彼此(A不從B繼承,並B不從A繼承)
  • A不相對於有序B如果他們都來自同一個超類繼承,但在其他方面沒有關係(從CA繼承,從CB繼承)
  • A沒有相對於責令B類,如果他們相互來自同一個子類繼承,但在其他方面沒有關係(來自AC繼承和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"; 
} 

輸出可以是"Unordered to",給定的某些輸入。

只有確保兩個泛型參數彼此相等的方法是對operator==有一個超載。

現在,你的好消息是,如果你正在構建一個二叉搜索樹,有一個不成文的約定,用於比較的類型應該至少是弱有序的(這意味着a==b將返回相同的!(a < b || b < a))。所以在你的具體情況下,只要提供的鍵值值是弱排序的,!(a < b || b < a)總是當對象相等時返回true。

但是您確實需要一些機制來確保用戶不會嘗試將部分排序的鍵傳遞給您的比較函數。否則,你堅持要求完整的operator==實施。

P.S:之前有人跳進去說:「什麼事?關於算術類型」,我想提醒你,NaN存在兼容IEEE浮點值,其中a < bb < a既可以返回false。如果ab都是NaN,即使兩個NaN值具有相同的有效負載,a == b也可以返回false!此外,這種關係是只保證整數在一個二進制補碼錶示,其中C++標準不需要

+0

真棒回答。詳細解釋我所困惑的一切。謝謝 – Siyavash

+0

@Siyavash然後把這個標記爲真正的正確答案 – RH6

相關問題