給定兩個二叉樹,想象當你將它們中的乙個覆蓋到另乙個上時,兩個二叉樹的一些節點便會重疊。你需要將他們合併為乙個新的二叉樹。合併的規則是如果兩個節點重疊,那麼將他們的值相加作為節點合併後的新值,否則不為 null 的節點將直接作為新二叉樹的節點。
示例 1:
輸入:原始二叉樹如下圖
輸出:合併後的二叉樹如下圖
注:本文中以如下所示節點表示空節點
基於遞迴的解決思路:
兩顆樹都從root開始遍歷,root合併之後生成新的root節點
接下來,合併兩顆樹的root.left 然後連線到新root的left上,合併原始root的right節點,連線到新root的right上。
基於上面分析,定義如下遞迴函式。
//合併給定的兩個節點
public treenode mergetree(treenode root1, treenode root2)
遞迴終止條件,如果其中乙個結點為空,如root2為空,如下,則直接返回root1
基於上面分析,**如下:
public treenode mergetree(treenode root1, treenode root2)
基於迭代的解決思路。題目沒有說不可以破壞原樹,此處不開闢額外的空間,在原樹上進行合併。我們此處假設把樹root2合併到root1上。我們可以定義乙個佇列輔助處理。每一次佇列頭的兩個元素分別**於兩顆二叉樹。代表此次要處理的節點,如果給定兩個節點,如何合併其子節點?有以下幾種方式。
(1)如果root1.left 和 root2.left 都不為空,直接執行root1.left.val = root1.left.val + root2.left.val,同時把root1.left 和 root2.left 入佇列即可
(2)如果root1.right和 root2.right都不為空,直接執行root1.right.val = root1.right.val + root2.right.val,同時把root1.right和 root2.right入佇列即可
(3)如果root1.left 為空,則直接把root2.left設定到root1.left上即可
(4)如果root1.right為空,則直接把root2.right設定到root1.right上即可
經過上面分析,**如下,配合注釋很好理解
public treenode mergetrees(treenode root1, treenode root2)
if (node1.right != null && node2.right != null)
//如果node1的left為空,則直接設定node1.left為node2.left
if (node1.left == null)
//如果node1的right為空,則直接設定node1.right為node2.right
if (node1.right == null)
}return root1;
}
617 合併二叉樹(leetcode)
給定兩個二叉樹,想象當你將它們中的乙個覆蓋到另乙個上時,兩個二叉樹的一些節點便會重疊。你需要將他們合併為乙個新的二叉樹。合併的規則是如果兩個節點重疊,那麼將他們的值相加作為節點合併後的新值,否則不為 null 的節點將直接作為新二叉樹的節點。題目鏈結 public class leetcode617...
leetcode合併二叉樹 617
給定兩個二叉樹,想象當你將它們中的乙個覆蓋到另乙個上時,兩個二叉樹的一些節點便會重疊。你需要將他們合併為乙個新的二叉樹。合併的規則是如果兩個節點重疊,那麼將他們的值相加作為節點合併後的新值,否則不為 null 的節點將直接作為新二叉樹的節點。address definition for a bina...
LeetCode617 合併二叉樹
給定兩個二叉樹,想象當你將它們中的乙個覆蓋到另乙個上時,兩個二叉樹的一些節點便會重疊。你需要將他們合併為乙個新的二叉樹。合併的規則是如果兩個節點重疊,那麼將他們的值相加作為節點合併後的新值,否則不為 null 的節點將直接作為新二叉樹的節點。示例 1 輸入 tree 1 tree 2 1 2 3 2...