簡體   English   中英

在 Java 中合並二叉樹

[英]Merging Binary Trees in Java

我一直在研究“合並兩個二叉樹”幾個小時,但我不明白為什么我的代碼不起作用。 我得到的樹 t1 為 [1,3,2,5],樹 t2 為 [2,1,3,null,4,null,7],我必須通過對重疊節點求和並避免空值來合並兩棵樹,其中可能,所以結果應該是 [3,4,5,5,4,null,7]。 我沒有像我應該的那樣創建一棵新樹,而是重寫樹 t1 以獲得所需的結果。 我的代碼如下:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
        traversal(t1, t2);
        return t1;
    }

    public void traversal(TreeNode t1, TreeNode t2) {
        if(t2 == null) return;
        if(t1 == null)
            t1 = new TreeNode(0);
        t1.val += t2.val;
        traversal(t1.left, t2.left);
        traversal(t1.right, t2.right);
    }
}

我的代碼運行沒有錯誤,我的最終結果是 [3,4,5,5],這顯然是錯誤的。 好像是線

t1 = new TreeNode(0);

不是在做我想讓它做的事情。 我希望它將當前節點從 null 更改為值為 0、一個 null 左節點和一個 null 右節點,以便在下一次迭代中,程序將迭代新創建的 null 左節點。

我嘗試在我的 IDE 中重新創建整個內容(包括類/方法聲明),以便使用它並進行一些調試,因此如果需要,我可以將我的完整代碼編輯到這篇文章中,但我也無法弄清楚如何去做

TreeNode(int val, TreeNode left, TreeNode right) {
  this.val = val;
  this.left = left;
  this.right = right;
}

當我希望左邊或右邊(但不是兩者)都為空時,所以我的完整代碼並不像它應該的那樣干凈。 在任何情況下,誰能幫我弄清楚為什么我的代碼對給定的輸入得到錯誤的答案?

我猜你的問題是下面的代碼並沒有真正做到你想要做的。

public void traversal(TreeNode t1, TreeNode t2) {
. . .
if(t1 == null)
    t1 = new TreeNode(0);
. . .

在這里,您將引用的本地副本更改為指向新對象。 不會更改原始對象 實際上,您不能使用與最初創建對象的原始方法不同的方法來執行此操作。 請參閱java 按值傳遞

所以基本上你創建一個新的TreeNode ,它沒有連接到父節點。 您必須手動執行此操作,同時還要跟蹤父節點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM