渡されたパラメータノードのルートを指すようにすることで、特定のノードのすべての祖先を圧縮しようとしています。
private E compressToRoot (E e) throws IllegalArgumentException;
たとえば、上の画像でcompressToRoot(D)を実行した場合、DはAを直接指し、CはAを直接指します。パラメーターとルートの間に他のノードがある場合、それらはすべてAを指します。
すべてのラベルと矢印は、2つの別々のマップに保存されます。
private Map<E,E> parentMap = new HashMap<E,E>(); //labels + arrows
この方法は、(1)Dとルートの間のすべてのノードをセットで保持することで完了できます。(2)セットポイントのすべての要素をルート(親にする)にする(3)ルートを返す。
ただし、このマップをトラバースしてルートに到達する方法に固執しています。だから、この方法では、私は次のようなことをします
private E compressToRoot (E e) throws IllegalArgumentException {
Set<E> collectLables = new HashSet<E>();
E root = null;
//get root.
for (E cycle : parentMap.keys()) {
while (parentMap.get(e) != e)
e = parentMap.get(e);
if (parentMap.get(e) == e)
root = cycle;
}
//collect all labels from parameter to root.
for (E element : parentMap.keys()) {
while (parentMap.get(e) != root) {
collectLables.add(element);
}
}
}
しかし、特定のノードの親をルートまで循環させる方法がわかりません。