2016-03-02 57 views
0

我想要實現的功能在搜索二叉樹的一個節點,並返回一個節點指針指向這樣找到的節點:C++函數總是返回相同的指針

template <class T> 
Node<T>* BST<T>::findNode(T a,Node<T>* node) 
{ 
    cout<<node->value<<endl; 
    if(a == node->value) 
    { 
    return node; 
    } 
    if(a < node->value) 
    { 
    if(node->left==NULL) 
    { 
     return NULL; 
    } 
    findNode(a, node->left); 
    } 
    if(a > node->value) 
    { 
    if(node->right==NULL) 
    { 
     return NULL; 
    } 
    findNode(a, node->right); 
    } 
} 

在主程序中,我有一個指針(稱爲bst)指向二進制搜索樹的實例,該實例填充了一些節點。我宣佈一個節點的指針,並呼籲像這樣的功能:

Node <int> * n = bst-> findNode(3,bst->head); 

問題:功能效果很好,如果它不能找到匹配的值,但是,如果它確實找到匹配的值(即走在if(a==node->value) block,它總是返回相同的值(在我的電腦中,節點n總是爲0x6的值),它是如何發生的,以及如何解決呢?

TIA!

回答

4

你的遞歸調用並不實際返回節點:它們需要看起來像

return findNode(a, node->left); 
+0

感謝您解決問題,沒有注意到返回的東西.. –

1

該功能只有在條件

if(a == node->value) 
{ 
    return node; 
} 

或類似這樣的

if(node->left==NULL) 
{ 
    return NULL; 
} 

在其他情況下,功能未定義行爲條件return語句。

而且這個說法在功能

cout<<node->value<<endl; 

的開始以及上面顯示的條件是錯誤的,因爲一般node可以等於nullptr

我會寫的函數通過以下方式

template <class T> 
Node<T>* BST<T>::findNode(Node<T> *node, const T &value) 
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
{ 
    if (node == nullptr || node->value == value) 
    { 
     return node; 
    } 
    else if (node->value < value) 
    { 
     return findNode(node->right, value); 
    } 
    else 
    { 
     return findNode(node->left, value); 
    } 
}