最後のリーフからルーツへのWinForms TreeViewコントロールを逆に反復する最適なアルゴリズムは何ですか? C#最後のリーフからルートへのツリービューノードを反復するアルゴリズム
答えて
バイナリツリーの場合、逆インオーダートラバーサルを探しています。これを実行するには、インオーダートラバーサル中にノードをリンクリスト(右のリンクノードを介して)にプッシュできます。次に、リンクされたリストを逆方向にそれを後方に読み取ります。
- バイナリ検索ツリーを、インオーダートラバーサルO(n)を使用して二重リンクリストに変換します。
- 2重リンクリストを逆方向にトラバースします。そのために2つのポインタを使用できます。
次に、あなたがBT(二分木)を持っている場合は、rootに葉からツリーを走査するための最良のツリーウォークはポストになる楽しさを持っており、それを最適化:)
と同じ構造で、インオーダートラバーサルはツリーを左から右に横断します。ポストオーダーはまず深みに行く。 – iGbanam
をすることができます注文木 - 歩いてください。これは左→右→ルートの順にノードを訪問します。これを逆にするには、right-> left-> rootを使います。
擬似コード:
BottomUpTraversal(x)
BottomUpTraversal(x.left)
BottomUpTraversal(x.right)
print(x.key)
コードは、以下の各ノードを訪問すると、それが葉になるまで、深さ優先、完全に横切ります。次に、スタックを巻き戻すと、各ノードにDoSomethingWithNode
が呼び出されます。 depth
パラメータは、ノードが逆の順序で返されることを示します。これはあなたの最初の最も深いリーフノードを与えるのではなく、ただのリーフノードであることを確認しますしないことを
ReverseTraverse(MyTreeView.Nodes, 1);
注:
void ReverseTraverse(TreeNodeCollection nodes, int depth)
{
if (nodes == null) return;
foreach (TreeNode child in nodes)
{
ReverseTraverse(child.Nodes, depth+1);
DoSomethingWithNode(child, depth);
}
}
はMyTreeView
がTreeView
インスタンスであると仮定すると、それを呼び出すにはその親ノードの前に出力します。あなたのツリーは次のようになります場合:
Node 1
Node 1.1
Node 1.2
Node 1.2.1
Node 2
Node 2.1
Node 2.1.1
Node 2.1.1.1
Node 2.1.2
出力順は次のようになります。
Node 1.1
Node 1.2.1
Node 1.2
Node 1
Node 2.1.1.1
Node 2.1.1
Node 2.1.2
Node 2.1
Node 2
あなたは(すなわちノード2.1.1.1は、第一の出力になります)最初の最も深いノードをしたい場合は、あなたがしたいですフル・トラバーサル(順方向では最も簡単なもの)を作成し、対応する深さのノードのリストを作成する必要があります。次に、リストを深さ(降順)でソートし、順番に出力します。
Downvoter:コメントは慣習的です。 –
私はdownvoterではありませんが、コードスニペットにはいくつかの欠陥があります。まず、TreeNodeCollectionは実際には 'object'のコレクションなので、' foreach'に 'TreeNode'の型を指定する必要があります。また、再帰的なメソッド呼び出しは、別のメソッド名を使用しています。疑似コードの観点からは素晴らしいですが、それは構築されません。また、 '.Nodes'で空のチェックを行う必要があるので、できるだけ詳しく調べないようにしてください。 –
@AdamPlocher:訂正していただきありがとうございます。一定。 –
- 1. ルートからリーフへの最短経路を計算する
- 2. 深さ最初のアルゴリズムを反復から反復に変更する
- 3. Pythonの反復アルゴリズム
- 4. イメージピクセルを反復するアルゴリズム
- 5. 反復アルゴリズム
- 6. オブジェクトへの最後の反復の割り当てのみ
- 7. 反復反復で最後の子を表示
- 8. Luaテーブルを最後からどのように反復するのですか?
- 9. 最後のforeachループの反復
- 10. Symfony:jsonオブジェクトから配列への反復
- 11. 反復番号を解決するアルゴリズム
- 12. 最後の反復ステップが最初のオブジェクトに戻るようにリストを反復処理する方法は?
- 13. Jinja2の反復で最後から二番目の要素を得る
- 14. 反復機械学習アルゴリズム
- 15. iterable:.next値の後に最初から反復を開始できますか?
- 16. _.forEach()ループの最後の反復を取得する方法
- 17. 最後の反復でのみ値を格納する
- 18. 反復特定のアルゴリズムとの関係
- 19. SparkからPandasデータフレームへ反復的に
- 20. リストから単一オブジェクトへの反復値を保存する
- 21. 相対位置ですべてのルートからリーフへのパスを出力する
- 22. バイナリツリー内のすべてのルートからリーフのパスを見つける(Pythonで)
- 23. ルートからルートへのリダイレクト
- 24. C#ListObject最後の行以外にもテーブルを反復する
- 25. 非バイナリツリーのルートからリーフまでのすべてのパスを見つける最適化された方法
- 26. 反復子が反復子を反復することからの反復論理
- 27. ソースからデスティネーションへのパスを見つける反復DFS
- 28. Tclのdictの最後のキーへの最速ルート
- 29. forループが最初の反復後に停止する -
- 30. 配列の最初と最後の数字を反復的に加算する
ノード自体の中で、各ノードの位置への参照をツリーに格納しています(つまり、先祖ノードへの参照を格納していますか? –
あなたはもっと詳しく説明する必要があると思います。どのように木構造ですか?各ノードは親ノードへの参照を持っていますか?あなたは特定のノードから出発し、ルートに直接移動するか、他のノードを横断する必要がありますか? – used2could
は、WinFormsのTreeViewコントロール – Cornel