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

2023-12-19 05:20

本文主要是介绍力扣日记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

这篇关于力扣日记12.18-【二叉树篇】合并二叉树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/511019

相关文章

Python实现合并与拆分多个PDF文档中的指定页

《Python实现合并与拆分多个PDF文档中的指定页》这篇文章主要为大家详细介绍了如何使用Python实现将多个PDF文档中的指定页合并生成新的PDF以及拆分PDF,感兴趣的小伙伴可以参考一下... 安装所需要的库pip install PyPDF2 -i https://pypi.tuna.tsingh

使用Apache POI在Java中实现Excel单元格的合并

《使用ApachePOI在Java中实现Excel单元格的合并》在日常工作中,Excel是一个不可或缺的工具,尤其是在处理大量数据时,本文将介绍如何使用ApachePOI库在Java中实现Excel... 目录工具类介绍工具类代码调用示例依赖配置总结在日常工作中,Excel 是一个不可或缺的工http://

使用Python创建一个能够筛选文件的PDF合并工具

《使用Python创建一个能够筛选文件的PDF合并工具》这篇文章主要为大家详细介绍了如何使用Python创建一个能够筛选文件的PDF合并工具,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录背景主要功能全部代码代码解析1. 初始化 wx.Frame 窗口2. 创建工具栏3. 创建布局和界面控件4

Python自动化办公之合并多个Excel

《Python自动化办公之合并多个Excel》在日常的办公自动化工作中,尤其是处理大量数据时,合并多个Excel表格是一个常见且繁琐的任务,下面小编就来为大家介绍一下如何使用Python轻松实现合... 目录为什么选择 python 自动化目标使用 Python 合并多个 Excel 文件安装所需库示例代码

使用Python合并 Excel单元格指定行列或单元格范围

《使用Python合并Excel单元格指定行列或单元格范围》合并Excel单元格是Excel数据处理和表格设计中的一项常用操作,本文将介绍如何通过Python合并Excel中的指定行列或单... 目录python Excel库安装Python合并Excel 中的指定行Python合并Excel 中的指定列P

基于C#实现PDF文件合并工具

《基于C#实现PDF文件合并工具》这篇文章主要为大家详细介绍了如何基于C#实现一个简单的PDF文件合并工具,文中的示例代码简洁易懂,有需要的小伙伴可以跟随小编一起学习一下... 界面主要用于发票PDF文件的合并。经常出差要报销的很有用。代码using System;using System.Col

Python视频剪辑合并操作的实现示例

《Python视频剪辑合并操作的实现示例》很多人在创作视频时都需要进行剪辑,本文主要介绍了Python视频剪辑合并操作的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录介绍安装FFmpegWindowsMACOS安装MoviePy剪切视频合并视频转换视频结论介绍

不删数据还能合并磁盘? 让电脑C盘D盘合并并保留数据的技巧

《不删数据还能合并磁盘?让电脑C盘D盘合并并保留数据的技巧》在Windows操作系统中,合并C盘和D盘是一个相对复杂的任务,尤其是当你不希望删除其中的数据时,幸运的是,有几种方法可以实现这一目标且在... 在电脑生产时,制造商常为C盘分配较小的磁盘空间,以确保软件在运行过程中不会出现磁盘空间不足的问题。但在

在C#中合并和解析相对路径方式

《在C#中合并和解析相对路径方式》Path类提供了几个用于操作文件路径的静态方法,其中包括Combine方法和GetFullPath方法,Combine方法将两个路径合并在一起,但不会解析包含相对元素... 目录C#合并和解析相对路径System.IO.Path类幸运的是总结C#合并和解析相对路径对于 C

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que