高效的树数据结构,不允许在同一级别上重复

时间:2016-06-02 09:43:40

标签: java data-structures tree

我正在开发一个树结构,它应该保证每个父节点只包含唯一的节点集。这是我的代码:

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()方法,它们只会检查同一级别上每个节点的完全父级是否相同。像这样:

    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);
    }

我想不出这可能成为问题的原因。你看到这个实现有什么问题吗?如果是这样,你能为这个问题提出更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

“应该保证每个父节点只包含唯一的节点集。”

根据我的意见,     private final List children = new LinkedList&lt;&gt;();

  1. 它应该是Map,这样您就可以保证子节点的唯一性(假设您已经实现了hashCode()和equals())。
  2. 如果我们把它当作Map,那么append()调用将是O(1)时间复杂度,在列表的情况下是O(n)。
  3. 如果您对将孩子定义为List有任何其他想法,请与我们分享。