2个二叉树的交集会引发Stack Overflow错误

时间:2012-06-30 03:38:56

标签: java binary-tree

我正在尝试将两个二叉树相交,并创建一个新的二叉树,其中的节点相同,但以下内容会创建stackOverflow错误。任何人都可以帮助我吗?

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

public OrderedSet<E> intersection(OrderedSet<E> other) {
    OrderedSet<E> result = new OrderedSet<E>();
    if (other.root == null || root == null)
        return result;
    else if (height() == 0 && other.height() == 0
            && other.root.data.equals(root.data)) {
        result.insert(root.data);
        return result;
    } else {
        intersection(other, root, other.root);
        result = resultIntersect;
    }
    return result;
}

private void intersection(OrderedSet<E> other, TreeNode root1,
        TreeNode root2) {
    if (root1 == root2) {
        resultIntersect.insert(root1.data);
    }
    if (root1 == null || root2 == null) {
        return;
    }
    intersection(other, root1.left, root2.left);
    intersection(other, root1.right, root2.right);
}

修改

我觉得这更接近我需要做的事情,但我仍然得到错误。

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

2 个答案:

答案 0 :(得分:1)

我不知道具体问题,但有一些问题。

  1. 为什么“其他”传入第二个交叉点(它从未使用过)?
  2. 插入套装后不应该返回吗?
  3. 你不应该传入本地OrderedSet(称为result)并插入其中而不是全局变量吗?
  4. 你不应该比较root1和root2的数据而不是节点本身吗?
  5. 第二次回归是多余的
  6. 您在测试null
  7. 之前取消引用的根
  8. 不需要进行初步测试
  9. 清理那些缺陷,我明白了:

    public OrderedSet<E> intersection(OrderedSet<E> other) {
        OrderedSet<E> result = new OrderedSet<E>();
        intersection(result, root, other.root);
        return result;
    }
    
    private void intersection(OrderedSet<E> result, TreeNode root1,
            TreeNode root2) {
        if (root1 == null || root2 == null) {
            return;
        }
        if (root1.data == root2.data) {
            result.insert(root1.data);
        }
        intersection(result, root1.left, root2.left);
        intersection(result, root1.right, root2.right);
    }
    

    我不知道这是否有效,但它更接近

答案 1 :(得分:0)

堆栈溢出错误表明在达到堆栈限制之前没有触底的递归。主要嫌疑人是private void intersection方法。如果输入是正确的二叉树,那么应该在某个时刻达到条件(root1 == null || root2 == null) - 但是对于非常大的,不平衡的二叉树来说这可能是很长的时间,或者如果“二叉树”是错误的,则永远不会在某个地方有一个循环。这两种情况都可能是溢出的原因。

我还要指出同一方法中的条件if (root1 == root2)可能没有达到它的目的:参数root1root2可能不是同一个对象,所以这种情况几乎肯定是假的。其他一些基于equals()的比较可能更合适。