解题思路
- 迭代法
只在一棵树上做改变:如果是重叠结点(即都有左孩子或者右孩子):用一个队列装入两棵树的重叠结点,两值相加,更新1树的结点值。如果不重叠,则将第二棵树有而第一棵树没有的结点连接到第一棵树上。利用层序遍历,分情况要讨论:(1)12树有左孩子;(2)12树有右孩子;(3)1树没有左孩子,2树有;(4)1树没有右孩子,2树有
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if(!root1)return root2;
if(!root2)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 && node2->left){
que.push(node1->left);
que.push(node2->left);
}
if(node1->right && node2->right){
que.push(node1->right);
que.push(node2->right);
}
if(!node1->left && node2->left){
node1->left=node2->left;
}
if(!node1->right && node2->right){
node1->right=node2->right;
}
}
return root1;
}
};
- 递归法
(1)确定 递归终止条件:遍历两棵树的结点,如果1树的结点为空,那就将2树的对应结点补上(2树为空也无所谓,补上还是空的) 同理2树的结点为空,就保持1树的结点,返回1树结点即可
(2)确定 单层递归逻辑:如果是重叠点,就将2树的结点值加到1树对应结点上。然后再对1树的左孩子2树的左孩子进行合并递归,对1树的右孩子2树的右孩子进行合并递归
(3)返回值:返回1树根结点
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if(!root1)return root2;
if(!root2)return root1;
root1->val+=root2->val;
root1->left=mergeTrees(root1->left,root2->left);
root1->right=mergeTrees(root1->right,root2->right);
return root1;
}
};