以下に示すようなツリーがあります。
- 赤は特定のプロパティがあることを意味し、塗りつぶされていないものはそれがないことを意味します。
Red
チェック を最小限にしたい。Red
すべての先祖もそうである場合Red
(再度チェックする必要はありません)。Not Red
すべての子孫がNot Red
.
- 木の深さは です
d
。 - 木の幅は です
n
。 子ノードの値は親よりも大きいことに注意してください。
- 例: 以下のツリーでは、
- ノード '0' には子 [1, 2, 3] があります。
- ノード '1' には子 [2, 3] があります。
- ノード '2' には子 [3] があり、
- ノード '4' には子 [] があります (子なし)。
したがって、子は次のように構築できます。
if vertex.depth > 0: vertex.children = [Vertex(parent=vertex, val=child_val, depth=vertex.depth-1, n=n) for child_val in xrange(self.val+1, n)] else: vertex.children = []
- 例: 以下のツリーでは、
ツリーの例を次に示します。
Red
ノード数を数えようとしています。木の奥行きも幅も大きくなります。したがって、一種の深さ優先検索を実行し、さらに上記のプロパティ 1 と 2 を使用したいと考えています。
そのツリーをトラバースするアルゴリズムを設計するにはどうすればよいですか?
PS: 私はこれに [python] というタグを付けましたが、アルゴリズムの概要は何でも構いません。
更新と背景
- プロパティ チェックを最小限に抑えたい。
- プロパティ チェックは、ツリーのパスから構築された 2 部グラフの接続性をチェックしています。
例:
- サンプル ツリーの左下のノードのパスは[0, 1] です。
- 二部グラフに集合
R
とC
サイズr
とがあるとしc
ます。(ツリーの幅は であることに注意してくださいn=r*c
)。 - パスから、完全なグラフから開始し、パス内のすべての値のエッジ (x, y) を次のように削除して、グラフのエッジに到達します
x, y = divmod(value, c)
。
プロパティ チェックの 2 つのルールは、グラフの接続性に由来します。- エッジ [a, b, c] を削除してグラフを切断する場合、追加のエッジ d [a, b, c, d] を削除してグラフを切断する必要があります (ルール 2)。
更新 2
だから私が本当にやりたいことは、[0..n] から d 要素を選択するすべての組み合わせをチェックすることです。ツリー構造はいくらか役に立ちますが、最適なツリー トラバーサル アルゴリズムを取得したとしても、チェックする組み合わせが多すぎます。(今気づいた。)
説明させてください。[4, 5] をチェックする必要があると仮定します (上記で説明したように、4 と 5 は 2 部グラフから削除されますが、ここでは関係ありません)。これが「赤」と表示された場合、私のツリーでは [4] のみをチェックできなくなります。それはいいです。ただし、チェックから [5] もマークする必要があります。
チェックの数をさらに最小限に抑えるために、ツリーの構造を (おそらくグラフに) 変更するにはどうすればよいですか?