给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
示例 1:
输入: Tree 1 Tree 2 1 2 / \ / \ 3 2 1 3 / \ \ 5 4 7 输出: 合并后的树: 3 / \ 4 5 / \ \ 5 4 7
注意: 合并必须从两个树的根节点开始。
思路:
用前序遍历逐个把tree2节点的val逐个累加到tree1的对应节点即可,由于在t1==nullptr而t2!=nullptr时,需要把t1父节点指向t2的节点,所以我们的递归函数必须把父节点也传进去。其次要注意控制边界条件:
1:t1==nullptr && t2==nullptr
2:t1!=nullptr && t2==nullptr
3:t1==nullptr && t2!=nullptr
4:t1!=nullptr && t2!=nullptr
代码如下:
void mergeTreesCore(TreeNode* t1, TreeNode* t2, TreeNode* t1_father, TreeNode* t2_father) {
if ((!t1 && !t2) || (t1 && !t2)) {
return;
}
if (!t1 && t2) {
if (t2_father->left==t2) {
t1_father->left = t2;
}
else {
t1_father->right = t2;
}
return;
}
else {
t1->val += t2->val;
}
mergeTreesCore(t1->left, t2->left, t1, t2);
mergeTreesCore(t1->right, t2->right, t1, t2);
}
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
if ((!t1 && !t2) || (t1 && !t2)) {
return t1;
}
if (!t1 && t2) {
return t2;
}
TreeNode* t1_father = new TreeNode(-1);
TreeNode* t2_father = new TreeNode(-1);
t1_father->left = t1;
t2_father->left = t2;
mergeTreesCore(t1, t2, t1_father, t2_father);
return t1;
}