给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
思路
如何同时遍历两棵树呢???
和遍历一棵树逻辑一致,但是传入的参数为两个树的节点,同时操作。
递归
前中后序遍历都可以,以前序遍历为例:
1. 确定递归的参数和返回值
传入的参数为两颗二叉树的根节点,返回值是合并后的二叉树的根节点。
2. 确定终止条件
传入两棵树后,那么就有两个树遍历的节点t1和t2,如果 t1==NULL,则两棵树合并为 t2。
if (t1 == NULL) return t2; // 如果t1为空,合并之后就应该是t2
if (t2 == NULL) return t1; // 如果t2为空,合并之后就应该是t1
3. 单层递归的逻辑
重复利用树 t1,t1就是合并后的树的根节点。
单层递归中,将两棵树的元素相加。
t1->left = mergeTrees(t1->left, t2->left);
t1->right = mergeTrees(t1->right, t2->right);
return t1;
合并代码:
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if(root1 == NULL) return root2;
if(root2 == NULL) return root1;
root1->left = mergeTrees(root1->left, root2->left);
root1->right = mergeTrees(root1->right, root2->right);
root1->val += root2->val;
return root1;
}
};
重新定义一棵树作为合并后的新树:
class Solution {
public:
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
if (t1 == NULL) return t2;
if (t2 == NULL) return t1;
// 重新定义新的节点,不修改原有两个树的结构
TreeNode* root = new TreeNode(0);
root->val = t1->val + t2->val;
root->left = mergeTrees(t1->left, t2->left);
root->right = mergeTrees(t1->right, t2->right);
return root;
}
};