2012-08-01 124 views
0

我一直在我的頭上靠着牆壁打了幾個小時。我不知道該怎麼做。我重構了我的函數幾次,仍然沒有得到它的正常工作。按名稱遍歷一棵樹C++

這是用於我的C++類中的編程任務。它必須有一個特定的形式,如數據類型,參數等,由教師給出,所以我不能改變這樣的事情。我們必須使用字符數組,因此strcmp()。如果我們找到它,我們必須返回該人,否則返回NULL。

繼承人什麼我與迄今爲止的工作:

person *classname::getPersonByName(char *name, person *rt) 
{ 
    if (rt != NULL) 
    { 
     if (strcmp(rt->Title, title) == 0) 
     { 
      return rt; 
     } 
     else 
     { 
      getPersonByName(title, rt->left); 
      getPersonByName(title, rt->right); 
      //return NULL; 
     } 
    } 
} 

在調試時,會發現和命名返回的人就好了。問題是,它是否會及時覆蓋我的回報,因此不會以正確的人爲結果。

NULL的底部被註釋掉,最終將每次調用設置爲NULL,無論搜索是否找到它。

+4

什麼是'title',爲什麼'name'閒置? – 2012-08-01 02:06:44

+0

這裏有一個提示:爲什麼函數在簽名中有'person *'? – irrelephant 2012-08-01 02:09:16

回答

2

的問題是,你是不是從遞歸調用返回任何東西

這個想法沒什麼不同ficult其實只是翻譯這個僞代碼:

// This is mostly a procedural way from your method signature, though you are using C++... 
Node getPersonByName(Node node, String name) { 
    if (node is null) { 
     return null 
    } 

    if (node.name == name) { 
     return Node 
    } 

    Node result = getPersonByName(node.left, name); 
    if (result is not null) { // found in node.left 
     return result; 
    } 

    result = getPersonByName(node.right, name); 
    if (result is not null) { // found in node.right 
     return result; 
    } 

    return null; 
} 

我會離開它作爲一門功課,爲您這個翻譯成C/C++,使結構看起來避免收益的多點更好

+0

非常感謝。遞歸只是讓我的頭腦旋轉了一下。我有一種感覺,我將無法停止思考,直到我得到它.....我只是這樣的強迫症。 :D – Nick 2012-08-01 02:27:57

+0

我記得我在joelonsoftware.com上讀到過,他說,即使他們嘗試了多年,有些人永遠也無法通過「遞歸」和「指針」屏障。我希望你不是那種人;) – 2012-08-01 02:34:10

2

對於遞歸工作,您需要將從調用獲得的值返回給函數。除此之外,你看起來像是混合了標題和名字。

person * foundPerson = NULL; 

else 
{ 

    foundPerson = getPersonByName(title, rt->left); 
    if(foundPerson != NULL) return foundPerson; 
    return getPersonByName(title, rt->right); 
    //return NULL; 
} 
0

您將title傳遞給遞歸調用和字符串測試。你不應該使用name?我假設title是當前節點的名稱。

什麼是類classname?當然,你會做這樣的:

person * person::findByName(char *name); 
+0

大聲笑,哦,我錯過了這一點=) – paddy 2012-08-01 02:11:35

+0

你應該添加這個作爲評論,因爲你沒有真正回答這個問題。 – 2012-08-01 02:12:09

+0

是的,它應該。我改變了這個問題的性質,並在意外事件中放棄了這部分。原來的作業是針對圖書館而不是個人,並且您按標題搜索書籍。我的b。 classname是庫。 – Nick 2012-08-01 02:12:14

1

它應該是這樣的(首先,與您傳遞(我認爲名字比較是你想要做什麼,其次,你的遞歸錯誤,當寫遞歸下降左,右子樹,Person*將被返回給父調用函數,你必須有回報太):

person *classname::getPersonByName(char *name, person *rt) 
{ 
    if (rt == NULL) 
     return NULL; 
    if (strcmp(rt->Title, name) == 0) 
    { 
     return rt; 
    } 
    Person *left = getPersonByName(name, rt->left); 
    if(left!=NULL) 
     return left; 
    Person *right = getPersonByName(name, rt->right); 
    if(right!=NULL) 
      return right; 
    return NULL; 
} 
+0

那如果說法末尾有.....如果是真的,那又怎麼樣?或者它有什麼關係?啊,好吧,我現在看到它。謝謝。 – Nick 2012-08-01 02:15:03

0

我已經做了很長一段時間,因爲我已經完成了樹搜索,但是有一些邏輯,例如
。樹的所有值都小於樹的左側,值大於樹的右側。這是僞代碼。您可能需要查找遍歷樹的算法。

while rt!=null 
if name ==rt-> name return rt 
else if name < rt->name then rt=rt->left //otherwise name is greater so on right side  

else rt=rt->right 
end while 

找不到名稱