LeetCode合併二叉樹

2021-10-19 08:08:32 字數 2310 閱讀 5556

給定兩個二叉樹,想象當你將它們中的乙個覆蓋到另乙個上時,兩個二叉樹的一些節點便會重疊。你需要將他們合併為乙個新的二叉樹。合併的規則是如果兩個節點重疊,那麼將他們的值相加作為節點合併後的新值,否則不為 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...