題目連結: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
思路:
這題我們需要對兩棵樹分別進行操作,其實對操作一棵樹是一模一樣的,只要我們同步兩棵樹的操作過程就好了
上遞迴三部曲
- 遞迴函式的引數和返回值,這題明顯我們要接收兩個根節點root1,root2作為引數傳入,我們可以選擇構造新的樹來儲存變化後的樹,也可也選擇直接在root1或root2上面進行修改。我們這裡選擇直接在root1上面進行修改
- 遞迴函式的終止條件(遞迴的邊界):
因為是傳入了兩個樹,那麼就有兩個樹遍歷的節點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;
}
};