LeetCode617. 合併二叉樹

Tomorrowland_D發表於2024-07-29

題目連結:https://leetcode.cn/problems/merge-two-binary-trees/description/

題目敘述:

給你兩棵二叉樹: root1 和 root2 。

想象一下,當你將其中一棵覆蓋到另一棵之上時,兩棵樹上的一些節點將會重疊(而另一些不會)。你需要將這兩棵樹合併成一棵新二叉樹。合併的規則是:如果兩個節點重疊,那麼將這兩個節點的值相加作為合併後節點的新值;否則,不為 null 的節點將直接作為新二叉樹的節點。

返回合併後的二叉樹。

注意: 合併過程必須從兩個樹的根節點開始。

示例 1:

輸入:root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7]
輸出:[3,4,5,5,4,null,7]

示例 2:

輸入:root1 = [1], root2 = [1,2]
輸出:[2,2]

提示:

兩棵樹中的節點數目在範圍 [0, 2000] 內
-10^4 <= Node.val <= 10^4

思路:

這題我們需要對兩棵樹分別進行操作,其實對操作一棵樹是一模一樣的,只要我們同步兩棵樹的操作過程就好了

上遞迴三部曲

  1. 遞迴函式的引數和返回值,這題明顯我們要接收兩個根節點root1,root2作為引數傳入,我們可以選擇構造新的樹來儲存變化後的樹,也可也選擇直接在root1或root2上面進行修改。我們這裡選擇直接在root1上面進行修改
  2. 遞迴函式的終止條件(遞迴的邊界):
    因為是傳入了兩個樹,那麼就有兩個樹遍歷的節點t1 和 t2,如果t1 == NULL 了,兩個樹合併就應該是 t2 了(如果t2也為NULL也無所謂,合併之後就是NULL)。
    反過來如果t2 == NULL,那麼兩個數合併就是t1(如果t1也為NULL也無所謂,合併之後就是NULL)
if (t1 == NULL) return t2; // 如果t1為空,合併之後就應該是t2
if (t2 == NULL) return t1; // 如果t2為空,合併之後就應該是t1

3.單層遞迴的邏輯:

單層遞迴的邏輯比較好寫,我們只需要將root2結點的值加到root1上面,然後遞迴構造root1的左子樹和root1的右子樹就行了

        root1->val+=root2->val;
        root1->left=mergeTrees(root1->left,root2->left);
        root1->right=mergeTrees(root1->right,root2->right);

程式碼:

class Solution {
public:
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        if(root1==NULL) return root2;
        if(root2==NULL) return root1;
        root1->val+=root2->val;
        root1->left=mergeTrees(root1->left,root2->left);
        root1->right=mergeTrees(root1->right,root2->right);
        return root1;
    }
};

迭代法

遞迴法能做的,迭代法也能做!下面是迭代法

class Solution {
public:
    TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
        if (t1 == NULL) return t2;
        if (t2 == NULL) return t1;
        queue<TreeNode*> que;
        que.push(t1);
        que.push(t2);
        while(!que.empty()) {
            TreeNode* node1 = que.front(); que.pop();
            TreeNode* node2 = que.front(); que.pop();
            // 此時兩個節點一定不為空,val相加
            node1->val += node2->val;

            // 如果兩棵樹左節點都不為空,加入佇列
            if (node1->left != NULL && node2->left != NULL) {
                que.push(node1->left);
                que.push(node2->left);
            }
            // 如果兩棵樹右節點都不為空,加入佇列
            if (node1->right != NULL && node2->right != NULL) {
                que.push(node1->right);
                que.push(node2->right);
            }

            // 當t1的左節點 為空 t2左節點不為空,就賦值過去
            if (node1->left == NULL && node2->left != NULL) {
                node1->left = node2->left;
            }
            // 當t1的右節點 為空 t2右節點不為空,就賦值過去
            if (node1->right == NULL && node2->right != NULL) {
                node1->right = node2->right;
            }
        }
        return t1;
    }
};

相關文章