2013-03-18 53 views
1

,我是想實現二進制搜索樹:搜索二叉樹功能不起作用C++

template <typename T> 
bool Tree<T>::search(TreeNode<T> *ptr, const T &key) { 
if (ptr == 0) { 
cout<<"No such data: "<<key<<" in the tree"<<endl; 
return false; 
} 
else{ 
if (ptr->data == key) { 
    cout<<"Find a node whose data is "<<key<<endl; 
     return true; 
} 
else if (ptr->data < key) return search(ptr->leftPtr,key); 

else return search(ptr->rightPtr,key); 
} 
} 

但結果總是返回false不管樹包含鍵值與否。 你們能幫我檢查一下代碼嗎?我嘗試過調試,但仍然不知道。

謝謝!

+0

考慮以下嚴格的順序編碼時,這。如果!((a WhozCraig 2013-03-18 09:23:32

回答

2

左樹下降的遍歷比較器是向後的。因此,只要您錯誤地進入權利樹你沒有機會找到價值。只有根和根才能正確找到。

此:

if (ptr->data < key) 
    return search(ptr->leftPtr,key); 
else 
    return search(ptr->rightPtr,key); 

應該這樣寫:

if (key < ptr->data) // <== note key is LESS THAN node. 
    return search(ptr->leftPtr,key); 
else 
    return search(ptr->rightPtr,key); 

也就是說,考慮一下:

template <typename T> 
bool Tree<T>::search(TreeNode<T> *ptr, const T &key) 
{ 
    if (ptr == 0) { 
     cout<<"No such data: "<<key<<" in the tree"<<endl; 
     return false; 
    } 

    if (key < ptr->data) 
     return search(ptr->leftPtr, key); 
    else if (ptr->data < key) 
     return search(ptr->rightPtr, key); 

    cout<<"Found a node whose data is "<< key << endl; 
    return true; 
} 
+0

謝謝!它終於有效。但我仍然不知道爲什麼。我認爲邏輯是一樣的。 – 2013-03-18 09:35:32

+0

@Zach_Cat哪個邏輯?我發佈的備用版本還是我在本答覆開始時發佈的代碼更正? – WhozCraig 2013-03-18 09:36:47

+0

替代版本。 – 2013-03-18 09:37:41