题目

给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。

思路1:递归遍历两棵树,构造一棵新的树

1、递归参数以及返回值
返回值:新树的结点
参数:两棵旧树
2、终止条件
两棵旧树的对应的该结点都为NULL
3、逻辑(这里直接贴代码和遇到的问题)
首先将情况分为4类:
如果t1 和t2 都是空结点,那么说明新树的这个结点也是NULL
如果t1 t2中一个位空一个不为空,我们可以直接将其中不为空的一个结点的信息直接传给新结点
如果t1 t2全部存在,那么将结点值相加,传给新结点。
注意当进行递归调用traversal时:
traversal(t1->left,t2->left);:必须要保证t1、t2都不为空,否则编译器会报错。
member access within null pointer of type 'TreeNode'

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {public:TreeNode* traversal(TreeNode* t1, TreeNode* t2){if(t1 == NULL && t2 == NULL) return NULL;int rootVal=0;if(t1 ==NULL && t2!=NULL) {rootVal = t2->val;TreeNode* NewRoot = new TreeNode(rootVal);NewRoot->left = t2->left;NewRoot->right = t2->right;return NewRoot;}else if(t1 !=NULL && t2==NULL){rootVal = t1->val;TreeNode* NewRoot = new TreeNode(rootVal);NewRoot->left = t1->left;NewRoot->right = t1->right;return NewRoot;} else{rootVal = t1->val + t2->val;TreeNode* NewRoot = new TreeNode(rootVal);NewRoot->left = traversal(t1->left,t2->left);NewRoot->right = traversal(t1->right,t2->right);return NewRoot;} }TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {return traversal(t1,t2);}
};

思路2:层序遍历两棵树,构造一棵新的树

在LeetCode 101. 对称二叉树 思考分析中,有过利用队列同时遍历两棵树的经历,这里回顾了一下,然后直接上。
这里完全是基于t1来的,当不重叠的时候,直接将t2的结点直接作为t1的节点,结点与孩子的关系也被传给t1了。

class Solution {public:TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {if(t1 == NULL && t2==NULL) return NULL;else if(t1 == NULL && t2!=NULL) return t2;else if(t1 != NULL && t2==NULL) return t1;queue<TreeNode*> que;que.push(t1);      que.push(t2); while(!que.empty()) {TreeNode* T1Node = que.front();que.pop();TreeNode* T2Node = que.front();que.pop();//此时两个结点一定不为空T1Node->val += T2Node->val;//如果两棵树左结点都不为空,加入队列if(T1Node->left && T2Node->left){que.push(T1Node->left);que.push(T2Node->left);}//如果两棵树右结点都不为空,加入队列if(T1Node->right && T2Node->right){que.push(T1Node->right);que.push(T2Node->right);}//当t1的某个结点为空时且t2的结点不为空,不入队列//当t1左结点为空,t2左结点不为空if(!T1Node->left && T2Node->left){T1Node->left = T2Node->left;}if(!T1Node->right && T2Node->right){T1Node->right = T2Node->right;}}    return  t1;}
};

leetcode 617. 合并二叉树 思考分析相关推荐

  1. Leetcode.617 合并二叉树

    题目链接 Leetcode.617 合并二叉树 easy 题目描述 给你两棵二叉树: root1和 root2. 想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会) ...

  2. LeetCode 617. 合并二叉树

    617. 合并二叉树   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博客地址为:亓官劼的博客,亓官劼的博客2. 难度 简单 题目 给定两 ...

  3. LeetCode 101. 对称二叉树 思考分析

    题目 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / 2 2 / \ / 3 4 4 3 但是下面这个 [1,2,2,null,3,null ...

  4. leetcode - 617. 合并二叉树

    给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠. 你需要将他们合并为一个新的二叉树.合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 ...

  5. [leetcode]617.合并二叉树

    给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠. 你需要将他们合并为一个新的二叉树.合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 ...

  6. LeetCode 617合并二叉树-简单

    给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠. 你需要将他们合并为一个新的二叉树.合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 ...

  7. LeetCode 617合并二叉树

    题目链接 :力扣 目录 思路: 递归 思路: 递归 递归函数声明 TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) : //合并根为root ...

  8. LeetCode:617. 合并二叉树

    给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠. 你需要将他们合并为一个新的二叉树.合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 ...

  9. leetcode 617. 合并二叉树 python

    题目描述: 题解: 1.如果当前位置两个二叉树的节点都非空,则将root1.val更新为root1.val和root2.val之和. 2.如果当前位置只存在root1或root2,则直接返回即可. 3 ...

最新文章

  1. python 编程该看那些书籍_初学者自学Python要看什么书?
  2. ESFramework介绍之(16)―― Tcp数据自动发送器ITcpAutoSender
  3. Zookeeper与paxos算法
  4. 关于Python IDE自动补全功能不好用的问题,解决方案
  5. How is note created - SAP backend implementation
  6. 高性能缓存服务器Varnish架构配置
  7. asyncio 文件io高并发_用 asyncio 封装文件读写
  8. Ubuntu 创建启动器
  9. JDK 动态代理和CGLIB 动态代理
  10. 辛普森法 matlab,MATLAB辛普森法则
  11. NAT地址转换顺序:inside→outside先路由再转换;outside→inside先转换再路由
  12. 相机标定(Camera calibration)原理、步骤
  13. 三子棋(九宫棋)游戏的实现(详细片)
  14. Android - 基于EasyAR SDK的AR红包的实现
  15. java中List Stream的简单使用
  16. 【VUE】将图片的url或file类型转换成base64,并压缩图片大小
  17. 基于角膜反射的学习心得
  18. 设备管理器里“SM总线控制器”、“其他PCI桥设备”驱动有问题
  19. 从Git上如何拉取远程分支(dev)到本地?
  20. 应届生面试要点总结(10)操作系统相关

热门文章

  1. java bits_一段关于JAVA程序升级的问题(Changing bits)
  2. python rtf转txt_将DOC、RTF格式文件批量转为TXT格式文件
  3. babel原理_带你了解 snowpack 原理,你还学得动么(下)
  4. 伪类 选择器优先级
  5. 推荐30个新鲜出炉的精美 jQuery 效果
  6. 深入理解JavaScript之Event Loop
  7. 关于 Nuxt 集成ueditor的一些坑(包括图片上传)前端部分
  8. vue兼容ie10问题并且node——module中出现es6语法如何解决
  9. vue笔记(一)基本使用、数据检测
  10. 『Balancing Act 树的重心』