递归:修改root1
- 1、确定递归函数的参数和返回值:
参数:root1、root2
返回值:合并之后的root1 - 2、确定终止条件:
如果root1=nullptr,那么就返回root2;如果root2=nullptr,那么就返回root1。 - 3、确定单层递归逻辑:
在单层递归中就是把两课树的元素加到一起
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if(root1==nullptr) return root2;
if(root2==nullptr) return root1;
root1->val=root1->val+root2->val;
root1->left=mergeTrees(root1->left,root2->left);
root1->right=mergeTrees(root1->right,root2->right);
return root1;
}
};
递归:定义新的树TreeNode* root=new TreeNode(0);
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
TreeNode* root=new TreeNode(0);
if(root1==nullptr) return root2;
if(root2==nullptr) return root1;
root->val=root1->val+root2->val;
root->left=mergeTrees(root1->left,root2->left);
root->right=mergeTrees(root1->right,root2->right);
return root;
}
};
迭代法:使用队列实现
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if(root1==nullptr) return root2;
if(root2==nullptr) return root1;
queue<TreeNode*> que;
que.push(root1);
que.push(root2);
while(!que.empty()){
TreeNode* node1=que.front();que.pop();
TreeNode* node2=que.front();que.pop();
node1->val+=node2->val;
if(node1->left!=nullptr&&node2->left!=nullptr){
que.push(node1->left);
que.push(node2->left);
}
if(node1->right!=nullptr&&node2->right!=nullptr){
que.push(node1->right);
que.push(node2->right);
}
if(node1->left==nullptr&&node2->left!=nullptr){
node1->left=node2->left;
}
if(node1->right==nullptr&&node2->right!=nullptr){
node1->right=node2->right;
}
}
return root1;
}
};