0
各親ノードに一意のノードセットしか含まれないようにするツリー構造を開発しています。同じレベルで複製が許可されていない効率的なツリーデータ構造
public class TreeNode implements Iterable<TreeNode> {
private final TreeNode parent;
private final List<TreeNode> children = new LinkedList<>();
public TreeNode(TreeNode parent) {
this.parent = parent;
}
public TreeNode append(TreeNode child) {
int index = children.indexOf(child);
if (index < 0) {
children.add(child);
return child;
} else {
return children.get(index);
}
}
public Iterator<TreeNode> iterator() {
return children.iterator();
}
/* Other unimportant application details */
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
TreeNode t = (TreeNode) o;
return parent != null ? parent.equals(t.parent) : t.parent == null;
}
public int hashCode() {
return parent != null ? parent.hashCode() : 0;
}
}
ここでの問題は私の木が深いのであれば、各children.indexOf()
呼び出しを再帰的に各append
メソッド呼び出し上のすべての親の平等をチェックすることです。ここに私のコードです。私は、equals()
とhashCode()
メソッドを再実装する方法は、同じレベルの各ノードに対して、Immetiateの親が同じであることをチェックするという方法です。ように:
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
TreeNode t = (TreeNode) o;
return parent == t.parent;
}
public int hashCode() {
return System.identityHashCode(parent);
}
私はこれが問題になる理由を考えることはできません。この実装の問題はありますか?もしそうなら、あなたはこの問題のより良い解決策を提案できますか?ありがとう!
私の場合、ブランチは非常にまれです。結果として得られるツリー構造は、幅よりも深い。私の意見では、このシナリオではリンクリストを保持する方が効率的です。しかし、あなたの答えに感謝します。 – SimY4