力扣日记12.18-【二叉树篇】合并二叉树

力扣日记:【二叉树篇】合并二叉树

日期:2023.12.18
参考:代码随想录、力扣

617. 合并二叉树

题目描述

难度:简单

给你两棵二叉树: root1 和 root2 。

想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。

返回合并后的二叉树。

注意: 合并过程必须从两个树的根节点开始。

示例 1:
在这里插入图片描述

输入:root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7]
输出:[3,4,5,5,4,null,7]

示例 2:

输入:root1 = [1], root2 = [1,2]
输出:[2,2]

提示:

  • 两棵树中的节点数目在范围 [0, 2000] 内
  • -10^4 <= Node.val <= 10^4

题解

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
#define SOLUTION 2
public:
#if SOLUTION == 1 TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {if (root1 == nullptr && root2 == nullptr) return nullptr;if (root2 == nullptr) {return root1;}if (root1 == nullptr) {return root2;}traversal(root1, root2);return root1;}void traversal(TreeNode* root1, TreeNode* root2) {// 把root1当作合并后的树root1->val = root1->val + root2->val;// 如果root1没有左节点、root2有if (root1->left == nullptr && root2->left != nullptr) {// 将root2的左子树作为root1的左子树root1->left = root2->left;} // 如果都有左节点(注意这里不能用if要用else if, 因为可能本来没有左节点经过上面的if语句就有了)else if (root1->left != nullptr && root2->left != nullptr) {// 对左子树进行递归traversal(root1->left, root2->left);}// 如果root1没有右节点、root2有if (root1->right == nullptr && root2->right != nullptr) {// 将root2的右子树作为root1的右子树root1->right = root2->right;}// 如果都有右节点(注意这里不能用if要用else if, 因为可能本来没有右节点经过上面的if语句就有了)else if (root1->right != nullptr && root2->right != nullptr) {traversal(root1->right, root2->right);}// 如果是root2->left或root2->right为空,则不需要处理}
#elif SOLUTION == 2 // 代码随想录ver// 输入参数为两树的根节点,返回值为合并后的节点(在tree1上进行修改)TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {// 如果 root1 为空,返回 root2if (root1 == nullptr) return root2;// 如果 root2 为空,返回 root1if (root2 == nullptr) return root1;// 如果两者不为空// 中root1->val += root2->val;// 递归处理左子树的情况(将tree1左子树与tree2左子树合并,并返回合并后的左子树作为root1的左子树)root1->left = mergeTrees(root1->left, root2->left);// 递归处理右子树的情况root1->right = mergeTrees(root1->right, root2->right);return root1;}
#endif
};

复杂度

时间复杂度:
空间复杂度:

思路总结

  • 我的思路:
    • 写的时候好晕,绕半天
    • 本题还是得从父节点的角度去处理子节点(看两个根节点是否有左右节点)
    • 这里将 root1 作为合并二叉树,需要处理①root1没有左节点而root2有左节点 或者 root1、root2都有左节点②root1没有右节点而root2有右节点 或者 root1、root2都有右节点 这些情况;对于root1有左(右)节点而root2没有,则不需处理
    • 注意 if-else if 在本题需要放在恰当的位置,先用 if-else if 处理好左节点情况即①、再以相同的方式处理右节点情况即②
  • 代码随想录的思路
    • 看了代码随想录的解法,感觉自己的思路真是放屁,这才是真正用了合并左右子树的递归啊(我的是单纯递归处理两个根节点去了)
    • 同样是在左树的基础上修改
    • 这里将合并子树的根节点在每次递归返回
    • 对于终止条件:
      • 如果 root1 为空,此时合并后的树的 root 为 root2,返回(隐含了对 root2 为空的处理:此时返回null)
      • 如果 root2 为空,此时合并后的树的 root 为 root1,返回(隐含了对 root1 为空的处理:此时返回null)
    • 如果都不为空,进入递归逻辑(前序遍历):
      • 中:对 左根节点的值进行修改
      • 左:将 tree1和tree2的左子树合并后的根节点作为左数的左节点
      • 右:将 tree1和tree2的右子树合并后的根节点作为左数的右节点
      • 最终返回合并后的左数根节点root1
  • 迭代:
    • 使用队列,模拟层序遍历
    • 迭代法中,一般一起操作两个树都是使用队列模拟类似层序遍历,同时处理两个树的节点
    • // TODO

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/285487.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

强化产品联动:网关V7独家解决方案的三重优势

客户背景 某央企单位汇聚了众多业内优秀的工程师和科研人员&#xff0c;拥有先进的研发设施和丰富的研发经验&#xff0c;专注于为全球汽车行业提供创新和实用的解决方案。其研发成果不仅在国内市场上得到了广泛应用&#xff0c;也在国际市场上赢得了广泛的认可和赞誉。 客户需…

【无标题】CTF之SQLMAP

拿这一题来说 抓个包 复制报文 启动我们的sqlmap kali里边 sqlmap -r 文件路径 --dump --dbs 数据库 --tables 表

Apipost检测接口工具的基本使用方法

&#x1f440; 今天言简意赅的介绍一款和postman一样好用的后端接口测试工具Apipost 专门用于测试后端接口的工具&#xff0c;可以生成接口使用文档官方下载网站&#xff1a;http://www.apipost.cn 傻瓜式安装—>register->项目->创建项目->APIs->新建目录&…

JVM-3-OutOfMemoryErrory内存溢出

堆溢出 Java堆用于储存对象实例&#xff0c;我们只要不断地创建对象&#xff0c;并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象&#xff0c;那么随着对象数量的增加&#xff0c;总容量触及最大堆的容量限制后就会产生内存溢出异常。 将堆的最小值-Xms…

windows下wsl(ubuntu)ldconfig报错

错误 sudo ldconfig /sbin/ldconfig.real: Cant link /usr/lib/wsl/lib/libnvoptix_loader.so.1 to libnvoptix.so.1 /sbin/ldconfig.real: /usr/lib/wsl/lib/libcuda.so.1 is not a symbolic link解决&#xff1a; 处理 sudo ldconfig 报错 libcuda.so.1 is not a symbolic …

JS的浅拷贝和深拷贝

首先理解什么是浅拷贝和深拷贝&#xff1a; 浅拷贝&#xff1a; 浅拷贝只会复制对象的第一层属性&#xff0c;而不会递归地复制嵌套的对象。浅拷贝仅复制对象的引用&#xff0c;新对象和原始对象仍然共享相同的引用&#xff0c;因此对新对象的修改可能会影响到原始对象。浅拷…

电子商务网站知识|搭建自己的电子商务网站需要注意什么|搭建电商独立站的注意事项

电子商务网站建设步骤包括什么呢? 电子商务网站建设第一步&#xff0c;网站的规划与设计 电子商务网站算是一个比较复杂的系统&#xff0c;电商网站建设前就要想好需要有的功能。电子商务网站的规划也是建所有网站都需要做的事情&#xff0c;在规划设计中需要对网站进行整体…

安装 anaconda2023.9 后发现 conda activate

在centos下载 anaconda2023.9 后发现 conda activate命令不能用了 报错如下 sage: conda [-h] [–no-plugins] [-V] COMMAND … conda: error: argument COMMAND: invalid choice: ‘activate’ (choose from ‘clean’, ‘compare’, ‘config’, ‘create’, ‘info’, ‘ini…

GO编程语言:简洁、高效、强大的开源编程语言

在现代软件开发领域&#xff0c;随着应用复杂度的不断提升&#xff0c;开发人员对编程语言的需求也日益增长。GO编程语言&#xff0c;作为一种简洁、高效且具备强大并发能力的新型开源编程语言&#xff0c;逐渐成为了许多开发者的首选。本文将详细介绍GO语言在哪些项目开发中表…

Kafka-Kafka基本原理与集群快速搭建

一、Kafka介绍 ​ ChatGPT对于Apache Kafka的介绍&#xff1a; Apache Kafka是一个分布式流处理平台&#xff0c;最初由LinkedIn开发并于2011年开源。它主要用于解决大规模数据的实时流式处理和数据管道问题。 Kafka是一个分布式的发布-订阅消息系统&#xff0c;可以快速地处理…

【MAC】M2 安装mysql

一、docker下载地址 下载地址 二、安装docker完成 三、安装mysql 一、拉取镜像 # 拉取镜像 docker pull mysql# 或者 docker pull mysql:latest# 以上两个命令是一致的&#xff0c;默认拉取的就是 latest 版本的# 我们还可以用下面的命令来查看可用版本&#xff1a; docker…

工业数据的特殊性和安全防护体系探索思考

随着工业互联网的发展&#xff0c;工业企业在生产运营管理过程中会产生各式各样数据&#xff0c;主要有研发设计数据、用户数据、生产运营数据、物流供应链数据等等&#xff0c;这样就形成了工业大数据&#xff0c;这些数据需要依赖企业的网络环境和应用系统进行内外部流通才能…