2017-05-08 7 views
1

にブール値を適用し、parent->子供の関係を検索:は、再帰的に私はこのような木を持っている場合は、分岐

A 
    B 
    C 
D 
    E 
F 

ユーザーが検索した場合Cのために、私は再帰的にツリーをドリルダウンしたい、セットプロパティをC(この例ではExpandedと呼びます)をtrueに設定します。ただし、そのプロパティを親に設定すると、A,B、およびCのいずれもExpandedがtrueに設定されます。

どのように再帰でこのようなことを達成できますか?

私はツリーの最も深い子にプロパティを設定するための解決策を持っていますが、展開するときに、それぞれの親にそのプロパティを設定しようとして問題が発生しています。

+4

実際のコードを表示できますか? –

+0

なぜこれをC#とjavascriptでタグ付けしましたか?どちらの方法でも、どのような構造もなく、このタイプの質問に答えるためには、データ構造と命名規則だけでなく、提案された解決策を作成する必要があるので、回答者には多くの質問があります。推測する。 –

+0

ほとんどの人がそれに答えました。私はちょうどdfsアルゴリズムを考慮する方法を追加することを考えました。変更されたバージョンは、あなたが期待しているものを提供します。 – arunk2

答えて

1

私のコードは、各Nodeが子供Nodesのコレクションを持っていることを前提としています。

最初のステップは、現在のNodeに一致するものがあるかどうかをチェックすることです(この例ではvalue)。存在する場合は、Expandedプロパティを設定し、呼び出し元にtrueを返します。

それ以外の場合は、子ノードを反復し、再帰的にDoSearchを呼び出します。いずれかの子ノードが一致する場合は、プロパティを現在の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; 
} 
関連する問題