我正在尝试将两个二叉树相交,并创建一个新的二叉树,其中的节点相同,但以下内容会创建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);
}
答案 0 :(得分:1)
我不知道具体问题,但有一些问题。
result
)并插入其中而不是全局变量吗? 清理那些缺陷,我明白了:
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)
可能没有达到它的目的:参数root1
和root2
可能不是同一个对象,所以这种情况几乎肯定是假的。其他一些基于equals()
的比较可能更合适。