最近、インタビューで、このノードクラスを与えられたツリー内のすべてのノードを数えるように求められました。私はインタビューの中で、脳のおならを持っていたもののツリー内のノードを再帰的にカウントしない。
class Node
{
public List<Node> Children;
}
iは再帰的にそれをしない数分で今朝これを書きました。
int CountNodes(Node node, int count)
{
count++;
if(node.Children == null)
return count;
foreach(Node n in node.Children)
{
count = CountNodes(n, count);
}
return count;
}
しかし、会話中に私たちは再帰的アプローチで問題を議論しました。 1つはスタックオーバーフローです。
これを解決するには、非再帰的な方法は何でしょうか。私はそれに苦しんでいるようだ。
だから、あなたが実装しました[深さ優先検索](https://en.wikipedia.org/wiki/Depth-first_search) - 代わりに[幅優先検索](https://en.wikipedia.org/wiki/Breadth-first_search)です。 )、これは基本的に[tail tail recursion](https://en.wikipedia.org/wiki/Tail_call)です。最後に、 'Node'の実装を制御すると、(ルート上に)子が追加されたときに' Node'インスタンスの子カウンタをインクリメントすることもできます。 –
一般的な方法は、キューを使用することです。アルゴリズムは簡単です:まず、ルートノードを追加します。次に、キューが空ではない間:デキューし、その上で何らかの操作を実行し、そのすべての子をキューに追加して繰り返します。 –