2012-06-30 48 views
0

可能重複:
Intersection of 2 binary trees throws Stack Overflow error
Java Binary Search Trees相交2個二叉樹 - 拋出堆棧溢出錯誤

我需要返回一個包含兩個二叉樹的重疊元素的新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; 
} 
+0

最有可能的是,您的樹形成不良,並循環回到以前的路口。將日誌記錄添加到每個'intersection'調用中,並查看它與您期望的偏離的位置。 –

+0

它立即失敗,我寫的私有變量有什麼問題嗎? – Tinkerbell

+0

你有沒有嘗試用調試器步進? – yshavit

回答

1

我在你的other question回答,但爲了完整性,在這裏再次。


雖然你不提它,你的發佈代碼沒有包含它,我猜OrderedSet<E> resultIntersectionOrderedSet<E>場。在這種情況下,當您創建OrderedSet<E>的新實例時,它會創建OrderedSet<E>的另一個實例以分配給resultIntersection。然後它擁有它自己的resultIntersection,需要創建一個OrderedSet<E>實例,依此類推......

修復方法是刪除resultIntersection並找到其他實現intersection的方法。在沒有必要的時候通過操作共享狀態來傳遞數據通常是不好的做法,因爲它會使邏輯更加難以遵循,並可能導致多線程問題。

+0

這很有道理,我沒有這樣想過。我無法改變它,所以我能夠返回OrderedSet。 – Tinkerbell