方法一:迭代法(层序遍历)
class Solution {
public:
TreeNode* mergeTrees(TreeNode* r1, TreeNode* r2) {
if (r1 == nullptr) return r2;
if (r2 == nullptr) return r1;
queue<TreeNode*> que;
que.push(r1);
que.push(r2);
while (!que.empty()) {
TreeNode* n1 = que.front();
que.pop();
TreeNode* n2 = que.front();
que.pop();
n1->val += n2->val;
if (n1->left != nullptr && n2->left != nullptr) {
que.push(n1->left);
que.push(n2->left);
}
if (n1->right != nullptr && n2->right != nullptr) {
que.push(n1->right);
que.push(n2->right);
}
if (n1->left == nullptr && n2->left != nullptr) {
n1->left = n2->left;
}
if (n1->right == nullptr && n2->right != nullptr) {
n1->right = n2->right;
}
}
return r1;
}
};
思路:经典的层序遍历,只不过这次是两棵树,我们只需要每次把两棵树的节点个入队列一个,然后每次出两次队列,然后对这两个节点进行比较即可,类似于以前写的对称二叉树的感觉。
方法二:递归
class Solution {
public:
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
if (t1 == NULL) return t2; // 如果t1为空,合并之后就应该是t2
if (t2 == NULL) return t1; // 如果t2为空,合并之后就应该是t1
// 修改了t1的数值和结构
t1->val += t2->val; // 中
t1->left = mergeTrees(t1->left, t2->left); // 左
t1->right = mergeTrees(t1->right, t2->right); // 右
return t1;
}
};
思路:通过先序遍历,完成对t1的改变。