同じデータを含み、ノードAが祖先としてノードBまたはBがの兄弟であるようにツリー上に配置されているノードのカップル(A、B)を識別するための高速アルゴリズムを見つけようとしています。 Aの祖先。
たとえば、次のツリーを見てください。このツリーでは、色がコンテンツを識別しています。
n6
n1
n1
の祖先と同じように一致n6
します。n5
とn3
は、の祖先であるn3
の兄弟と同じように一致します。n2
n5
n3
とn7
同じ理由で一致します。n5
n7
n7
の祖先でも、の祖先のn5
1つの兄弟でもないため、一致しませんn5
。n2
n4
同じ理由で一致しません。
「ルールチェッカー」のナイーブな実装は簡単ですが、ツリーを複数回トラバースする必要があります(チェックされるノードごとに1回)。ただし、ツリーの2つの特別なプロパティを活用して、より良いソリューションを実装できると感じています。 。問題の2つのプロパティは次のとおりです。
- 同じコンテンツを持つすべてのノードのフラットリストを取得できます(上記の例では、、、、を取得
(n5, n3, n7)
し(n1, n6)
ます(n2, n4)
。 - 私の各ノードは、その親とそのすべての子の両方への参照を格納します(このプロパティは、リンクリストのように再帰的に利用できます)。
...しかし、一致するノードをすばやく見つける方法が必要であると確信しているにもかかわらず、これまでのところ、それを見つけることができませんでした。
私は現在Pythonで作業していますが、擬似コードや他の難解ではない言語の例も歓迎されます。