2014-01-08 40 views
0

,這是我的功能在BST搜索:遞歸BST發現元素不能很好地工作

BST* BSTFindElement(BST const *pTree, float find_value) 
{ 
    if(pTree) 
    { 
     if(find_value > pTree->value) 
      BSTFindElement(pTree->right, find_value); 
     else if(find_value < pTree->value) 
      BSTFindElement(pTree->left, find_value); 
     return (BST*)pTree; 
    } 
    else 
    { 
     return 0; 
    } 
} 

當浮子數量不是在樹中,則返回任何方式 出現的問題(BST *)ptree中。 我調試了,我發現它工作得很好,例如,如果根是'3.6',我搜索了5它進入pTree->右邊搜索它,然後當它跳過 if(pTree) it返回0,但由於某種原因返回頂部並返回(BST *)pTree再次...我不能自己解決問題,任何人都可以幫助我嗎?謝謝!

回答

2

您尋找3.6和ptree->值是5,那麼你可以去這裏:

else if(find_value < pTree->value) 
     BSTFindElement(pTree->left, find_value); 

那麼ptree中,所以你返回0爲空,你回到先前的堆棧幀,我的意思是完全在BSTFindElement(pTree-> left,find_value)之後;而下面的語句是

return (BST*)pTree; 

,這是發生了什麼,你回ptree中,摧毀了以前返回0。如果你把它改寫爲:

else if(find_value < pTree->value) 
     BSTFindElement(pTree->left, find_value); 
else  
     return (BST*)pTree; 

這仍然不是應該解決所有的問題。我想這會工作

 if(find_value > pTree->value) 
       **return** BSTFindElement(pTree->right, find_value); 
    else if(find_value < pTree->value) 
      **return** BSTFindElement(pTree->left, find_value); 
    **else** 
     return (BST*)pTree; 
1

看來,當查找值不同於pTree值時,則總是返回輸入pTree。 您是否嘗試過改變你的代碼:

BST* BSTFindElement(BST const *pTree, float find_value){ 
if(pTree){ 
    if(find_value > pTree->value){ 
     return BSTFindElement(pTree->right, find_value); 
    } 
    else if(find_value < pTree->value){ 
     return BSTFindElement(pTree->left, find_value); 
    } 
    return (BST*)pTree; 
} 
else{ 
    return 0; 
}