0

可能重复:
2 个二叉树的交集引发 Stack Overflow 错误
Java Binary Search Trees

我需要返回一个新的 OrderedSet,其中包含两个二叉树的重叠元素。我认为这是引发错误的私有 OrderedSet,至少这是 eclipse 告诉我的。

private OrderedSet<E> resultIntersect = new OrderedSet<E>();

public OrderedSet<E> intersection(OrderedSet<E> other) {
    OrderedSet<E> result = new OrderedSet<E>();
    result = resultIntersect;
    return result;
}

private void intersection(OrderedSet<E> other, TreeNode t) {
    if (other.contains(t.data)) {
        resultIntersect.insert(t.data);
    }
    if(t.left != null)
        intersection(other, t.left);
    if(t.right != null)
        intersection(other, t.right);
}

**编辑

我似乎无法让它正确返回。如何让私有方法正确返回结果?

    public OrderedSet<E> intersection(OrderedSet<E> other) {
    OrderedSet<E> result = new OrderedSet<E>();
    result = intersection(other, root, result);
    return result;
}

private OrderedSet<E> intersection(OrderedSet<E> other, TreeNode t, OrderedSet<E> result) {
    if (other.contains(t.data)) {
        result.insert(t.data);
    }
    if (t.left != null && t.right != null)
        return intersection(other, t.left, result) + intersection(other, t.right, result);
    if (t.left != null)
        intersection(other, t.left, result);
    if (t.right != null)
        return intersection(other, t.right, result);
    else
        return result;
}
4

1 回答 1

1

我在你的另一个问题中回答了,但为了完整起见,又来了。


尽管您没有提及它,并且您发布的代码也没有包含它,但我猜OrderedSet<E> resultIntersectionOrderedSet<E>. 在这种情况下,当您创建它的新实例时,OrderedSet<E>会创建另一个OrderedSet<E>要分配给的实例resultIntersection。然后有它自己resultIntersection的需要OrderedSet<E>创建的实例,依此类推......

解决方法是删除resultIntersection并找到其他一些实施方式intersection。在不需要时通过操纵共享状态来让方法传递数据通常是不好的做法,因为这会使逻辑更难以遵循并且可能导致多线程问题。

于 2012-06-30T07:51:45.330 回答