2013-03-15 122 views
0

此函數遞歸調用自身以搜索Btree,如果找到該值,則返回true;如果未找到,則返回false。如果找不到,我也希望它在最後一次找到「未找到」。它可以正常工作,只是它會自動調用「無法找到」多次(每次它找不到的級別)。B樹遞歸搜索C++

bool lookup(int val, btnode *n) //returns true/false if value is in btree 
{ 

if (n==NULL) return false; //empty tree 

for (int i=0;i< n->count;i++) //check in present node for the val 
    if(n->value[i]==val) 
    { 
     flag = true; 
     return true; 
    } 



//check in child node 

    for(int i =0;i<n->count;i++) //check for child node 
    { if(val < n->value[i]) 
     { cout<<"checking a different node."<<endl; 
      lookup(val,n->child[i]); 
     } 
    } 
    if(val > n->value[(n->count)-1]) 
    { 
     cout<<"searching a right subtree"<<endl; 
     lookup(val, n->child[n->count]); 
    } 
if (flag==false) 
return false; 
else return true; 
} 

bool lookup2(int val, btnode *n) 
{ 
if(lookup(val, n)==false) 
{ 
    cout<<"not found"<<endl; 
    return false; 
} 
else 
{ 
    cout<<"Found it"<<endl; 
    return true; 
    } 
} 
+1

有兩個功能。實際打印的一個,以及您現在正在遞歸執行工作的那個。 – zz3599 2013-03-15 21:12:46

+0

爲什麼不在調用者那裏做這件事,而不是試圖在這裏使用這種方法呢? – Tawnos 2013-03-15 21:13:26

+0

另外一個'bool contains()'函數幾乎沒有比'location find()'更有用。 – 2013-03-15 21:18:15

回答

2

您可能想要創建一個調用此查找函數的輔助方法,並進行打印。喜歡的東西:

bool lookup_print(int val, btnode *n) { 
    bool found = lookup(val, n); 
    if (found) { 
     cout << "Found it!" << endl; 
    } else { 
     cout << "Not found..." << endl; 
    } 
    return found; 
} 

此外,您還需要確保,如果他們真的找到一個節點的遞歸調用正在返回它們的值。所以無論你在哪裏,你都會想要類似的東西:

bool found = lookup(val,n->child[i]); 
if (found) { 
    return found; 
} 
+0

我試過這個,不幸的是我得到一個錯誤的「未找到」,除非值在根節點。即該函數向下遍歷到子節點,該節點返回true,但頂層函數將返回false。基本上,如果它返回true我想完成,跳出遞歸循環,並返回true。否則返回false。 – user1657563 2013-03-15 21:20:31

+0

你在我的答案中使用了第二位代碼嗎? – Xymostech 2013-03-15 21:25:09

+0

好吧,我採取了你的意見,並添加了一個名爲lookup2的輔助功能。我不得不改變的是把一個靜態標誌,當它被發現時切換爲真。 – user1657563 2013-03-15 21:29:53