私はツリー データ構造を c# ベースで実装しています (主にDan Vanderboom の Generic implementationに基づいています)。私は現在、Dan が実装していない Count プロパティを処理する方法を検討しています。
明白で簡単な方法は、ツリーをトラバースしてノードを追加する再帰呼び出しを使用することです (または、必要に応じて、キューを使用してツリーを繰り返しトラバースし、ノードをカウントします)。ただ高価に思えます。(また、いくつかのノードを遅延ロードしたい場合もあります)。
ルート ノードでカウントを維持できました。すべての子は、ルートまでトラバースするか、ルートへの参照を保持し、変更時に内部的に設定可能な count プロパティを更新します。これにより、ブランチを分割したり、特定のノードの下にあるすべての子をクリアしたりするときに、反復の問題が発生します。一般的に安価であり、関数と呼ばれる頻度が低いと思われる重労働を行います。
少し力ずくのように思えますが、それは通常、私がまだ考えていない例外ケース、または必要に応じてバグを意味します。
その場でカウントするのではなく、アンバランスおよび/または非バイナリツリー構造のカウントを保持する実装の例はありますか? 遅延読み込みについて心配する必要はありません。特定のニーズに合わせて例を調整できると確信しています。