Given two binary trees and imagine that when you put one of them to cover the other, some nodes of the two trees are overlapped while the others are not.

You need to merge them into a new binary tree. The merge rule is that if two nodes overlap, then sum node values up as the new value of the merged node. Otherwise, the NOT null node will be used as the node of new tree.

Example 1:

Input:
Tree 1 Tree 2
1 2
/ \ / \
3 2 1 3
/ \ \
5 4 7
Output:
Merged tree:
3
/ \
4 5
/ \ \
5 4 7

Note: The merging process must start from the root nodes of both trees.

这道题给了两个二叉树,让我们合并成一个,规则是,都存在的结点,就将结点值加起来,否则空的位置就由另一个树的结点来代替。那么根据过往经验,处理二叉树问题的神器就是递归。根据题目中的规则,如果要处理的相同位置上的两个结点都不存在的话,直接返回即可,如果 t1 存在,t2 不存在,就以 t1 的结点值建立一个新结点,然后分别对 t1 的左右子结点和空结点调用递归函数,反之,如果 t1 不存在,t2 存在,就以 t2 的结点值建立一个新结点,然后分别对 t2 的左右子结点和空结点调用递归函数。如果 t1 和 t2 都存在,就以 t1 和 t2 的结点值之和建立一个新结点,然后分别对 t1 的左右子结点和 t2 的左右子结点调用递归函数,参见代码如下:

解法一:

class Solution {
public:
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
TreeNode *res = NULL;
helper(t1, t2, res);
return res;
}
void helper(TreeNode* t1, TreeNode* t2, TreeNode*& res) {
if (!t1 && !t2) return;
else if (t1 && !t2) {
res = new TreeNode(t1->val);
helper(t1->left, NULL, res->left);
helper(t1->right, NULL, res->right);
} else if (!t1 && t2) {
res = new TreeNode(t2->val);
helper(NULL, t2->left, res->left);
helper(NULL, t2->right, res->right);
} else {
res = new TreeNode(t1->val + t2->val);
helper(t1->left, t2->left, res->left);
helper(t1->right, t2->right, res->right);
}
}
};

其实远不用写的像上面那么复杂,连额外的函数都不用写,直接递归调用给定的函数即可,首先判断,如果 t1 不存在,则直接返回 t2,反之,如果 t2 不存在,则直接返回 t1。如果上面两种情况都不满足,那么以 t1 和 t2 的结点值之和建立新结点t,然后对 t1 和 t2 的左子结点调用递归并赋给t的左子结点,再对 t1 和 t2 的右子结点调用递归并赋给t的右子结点,返回t结点即可,参见代码如下:

解法二:

class Solution {
public:
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
if (!t1) return t2;
if (!t2) return t1;
TreeNode *t = new TreeNode(t1->val + t2->val);
t->left = mergeTrees(t1->left, t2->left);
t->right = mergeTrees(t1->right, t2->right);
return t;
}
};

Github:

https://github.com/grandyang/leetcode/issues/617

参考资料:

https://leetcode.com/problems/merge-two-binary-trees/

https://leetcode.com/problems/merge-two-binary-trees/discuss/104299/Java-Solution-6-lines-Tree-Traversal

https://leetcode.com/problems/merge-two-binary-trees/discuss/104301/Short-Recursive-Solution-w-Python-and-C%2B%2B

LeetCode All in One 题目讲解汇总(持续更新中...)

最新文章

  1. Win10 UWP 开发系列:使用多语言工具包让应用支持多语言
  2. 使用TaskManager爬取2万条代理IP实现自动投票功能
  3. CS: Marshalling and Unmarshalling, Serialization and Unserialization
  4. [译] 第三十天:Play Framework - Java开发者梦寐以求的框架 - 百花宫
  5. SAP 通过屏幕字段查看透明表
  6. python 数字和字符串转换问题
  7. jquery操作cookie {分享}
  8. 【转】我的WIN7分辨率是1920*1080,调低后字体模糊
  9. vijos P1375 大整数(高精不熟的一定要做!)
  10. 将用户信息保存到Cookie中
  11. UVA11456--dp,LIS
  12. tar.gz文件命名和压缩解压方法
  13. Spring--AOP--面向切面编程
  14. 原型那些事 - JavaScript深入浅出(三)
  15. C#串口发送数据
  16. storm消费kafka实现实时计算
  17. Hibernate入门(十)inverse
  18. PHP-预定义函数访问数据库
  19. css table样式
  20. 数据结构(C语言)—排序

热门文章

  1. liunx下安装mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz
  2. mycat 白话配置
  3. git 创建标签 tag
  4. ubuntu 换源 aliyun
  5. SQL Server like 字段
  6. 重温CLR(十七)程序集加载和反射
  7. Lucene queryParser和analysis有什么不同?
  8. RT-Thread点亮led
  9. spring boot的gradle整合日志
  10. bootstrap的下拉菜单组件与导航条