2017-05-08 76 views
1

如果我有這樣的樹:遞歸搜索對家長>兒童的關係,應用布爾到分支

A 
    B 
    C 
D 
    E 
F 

如果C用戶搜索,我想遞歸地鑽到樹,設置財產C(在本例中稱爲Expanded)爲true ...但是也在其父母上設置了該財產,因此ABCExpanded設置爲true。

我如何用遞歸完成這樣的事情?

我有一個解決方案(抽象地)設置樹中最深的孩子的屬性,但是當展開的時候我遇到了一個問題,試圖在它的每個父級上設置該屬性。

+4

你能顯示實際的代碼嗎? –

+0

爲什麼你用c#和javascript標記這個?無論哪種方式,沒有任何結構,這就要求很多回答者,因爲爲了回答這種類型的問題,它需要他們不僅創建數據結構和命名約定,還要創建*提議的解決方案一個推測。 –

+0

大多數人回答了它。我只是想考慮如何考慮dfs算法。修改後的版本會給你你所期待的。 – arunk2

回答

1

我的代碼假定每個Node有子Nodes的集合。

第一步是檢查當前的Node是否匹配(在本例中爲value)。如果是,請設置Expanded屬性並將true返回給調用者。

否則,迭代子節點並遞歸調用DoSearch。如果任何子節點匹配,則設置Expanded屬性當前爲Node,並將true返回給調用者。

bool DoSearch(Node n, int value) 
{ 
    if (n.Value == value) 
    { 
     n.Expanded = true; 
     return true; // let the caller know that the value was found 
    } 
    foreach (Node child in n.Nodes) 
    { 
     if (DoSearch(child, value)) // a child contains the value 
     { 
      n.Expanded = true; 
      return true; // let the caller know that the value was found 
     } 
    } 
    return false; // not found 
} 
1

你不需要遞歸函數來實現這一點。在設置擴展屬性的同時找到您想要的節點並遍歷到根目錄。

var runner = FindNode('C'); 
while(runner) { 
    runner.expanded = true; 
    runner = runner.parent; 
}