力扣第617题 合并二叉树 c++ 前中后序 完成 附加迭代版本

news2024/11/15 2:00:00

题目

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] 内
  • -104 <= Node.val <= 104

思路和解题方法

  1. 如果两棵树都为空,返回 null。
  2. 如果其中一棵树为空,返回另一棵树。
  3. 如果两棵树根节点的值相同,将它们的值相加作为新树的根节点,同时将两棵树的左子树和右子树分别递归处理并合并。
  4. 如果两棵树根节点的值不同,将它们的值中不为 null 的一个作为新树的根节点,同时将不为 null 的一个树的左子树和右子树分别递归处理并合并,将另一棵树的左子树和右子树分别作为新树的左子树和右子树。

复杂度

        时间复杂度:

                O(min(m,n))

        该算法,时间复杂度为 O(min(m,n)),其中 m 和 n 分别为两棵二叉树的节点数。这是因为每个节点最多只会被访问一次,因此总共遍历的节点数不会超过两棵树中节点个数的较小值。

        空间复杂度

                O(min(m,n)) 或 O(logm)(或 O(logn),如果两棵树的深度相同)

        空间复杂度,递归调用 mergeTrees 函数时可能会使用 O(min(m,n)) 的栈空间,因为每次递归都只处理其中一棵树的子树,因此栈的最大深度就是较小的子树的最大深度。如果两棵树的深度相同,则使用 O(logm) 或 O(logn) 的栈空间,取决于树的深度。此外,在返回合并后树的时候,需要分配 O(1) 的额外空间来存储新的树节点。

c++ 代码

 ​前序

class Solution {
public:
    TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
        if (t1 == NULL) return t2; // 如果 t1 为空,合并之后就应该是 t2
        if (t2 == NULL) return t1; // 如果 t2 为空,合并之后就应该是 t1
        
        t1->val += t2->val;                             // 将 t1 的值加上 t2 的值,作为新树合并后的根节点的值
        
        t1->left = mergeTrees(t1->left, t2->left);      // 合并 t1 和 t2 的左子树,递归调用 mergeTrees 函数
        t1->right = mergeTrees(t1->right, t2->right);   // 合并 t1 和 t2 的右子树,递归调用 mergeTrees 函数
        
        return t1; // 返回合并后的树
    }
};

 ​中序

class Solution {
public:
    TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
        if (t1 == NULL) return t2; // 如果t1为空,合并之后就应该是t2
        if (t2 == NULL) return t1; // 如果t2为空,合并之后就应该是t1

        t1->left = mergeTrees(t1->left, t2->left);      // 递归合并t1和t2的左子树
        t1->val += t2->val;                             // 将t1的值加上t2的值,作为新树合并后的根节点的值
        t1->right = mergeTrees(t1->right, t2->right);   // 递归合并t1和t2的右子树
        return t1;                                      // 返回合并后的树
    }
};

后序

class Solution {
public:
    TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
        if (t1 == NULL) return t2; // 如果t1为空,合并之后就应该是t2
        if (t2 == NULL) return t1; // 如果t2为空,合并之后就应该是t1

        t1->left = mergeTrees(t1->left, t2->left);      // 递归合并t1和t2的左子树
        t1->right = mergeTrees(t1->right, t2->right);   // 递归合并t1和t2的右子树
        t1->val += t2->val;                             // 将t1的值加上t2的值,作为新树合并后的根节点的值
        return t1;                                      // 返回合并后的树
    }
};

定义新二叉树节点

class Solution {
public:
    TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
        if (t1 == NULL) return t2; // 如果t1为空,合并之后就应该是t2
        if (t2 == NULL) return t1; // 如果t2为空,合并之后就应该是t1

        // 创建一个新的节点,不修改原有两个树的结构
        TreeNode* root = new TreeNode(0);
        root->val = t1->val + t2->val;                        // 将t1和t2对应节点的值相加,赋值给新节点的值
        root->left = mergeTrees(t1->left, t2->left);           // 递归合并t1和t2的左子树
        root->right = mergeTrees(t1->right, t2->right);        // 递归合并t1和t2的右子树
        return root;                                          // 返回合并后的树
    }
};

迭代版本

class Solution {
public:
    TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
        if (t1 == NULL) return t2; // 如果t1为空,合并之后就应该是t2
        if (t2 == NULL) return t1; // 如果t2为空,合并之后就应该是t1
        
        queue<TreeNode*> que;
        que.push(t1);
        que.push(t2);
        
        while(!que.empty()) {
            TreeNode* node1 = que.front(); que.pop();
            TreeNode* node2 = que.front(); que.pop();
            // 此时两个节点一定不为空,val相加
            node1->val += node2->val;

            // 如果两棵树左节点都不为空,加入队列
            if (node1->left != NULL && node2->left != NULL) {
                que.push(node1->left);
                que.push(node2->left);
            }
            // 如果两棵树右节点都不为空,加入队列
            if (node1->right != NULL && node2->right != NULL) {
                que.push(node1->right);
                que.push(node2->right);
            }

            // 当t1的左节点为空,t2左节点不为空,就赋值过去
            if (node1->left == NULL && node2->left != NULL) {
                node1->left = node2->left;
            }
            // 当t1的右节点为空,t2右节点不为空,就赋值过去
            if (node1->right == NULL && node2->right != NULL) {
                node1->right = node2->right;
            }
        }
        
        return t1;
    }
};

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 nodejs,SpringBoot 两种方式实现 WebSocket

前言 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议&#xff0c;它可以让浏览器和服务器之间实现实时双向数据传输。 WebSocket 的优点是&#xff1a; 可以节省服务器资源和带宽&#xff0c;提高性能和效率可以让服务器主动向客户端推送数据&#xff0c;实现实时响…

Nacos 小bug: application.properties配置未生效,导致端口未生效

最近用了下nacos 1.4.6 ,发现windows 中修改配置中的启动端口未生效&#xff0c;其实就是配置文件没读取到。 去github 逛了一下issue ,参考这个&#xff1a;https://github.com/alibaba/nacos/issues/10217 这哥们儿是nacos 1.4.5 Linux系统下的相同问题&#xff0c;shell 中…

发掘Linux世界的终极工具,推荐11款Linux桌面终端模拟器

发掘Linux世界的终极工具&#xff0c;推荐11款Linux桌面终端模拟器 广漂客家妹小关vlog2023-07-14 10:46广东 作为Linux使用者&#xff0c;我们深知终端的力量和灵活性。而选择一个适合自己需求的终端模拟器&#xff0c;则是提升工作效率和体验的关键。现如今&#xff0c;众多…

碰撞检测算法——分离轴算法在Unity中实现(一)

在实现分离轴算法前&#xff0c;需要做一些准备工作&#xff0c;在Unity中实现自定义多边形的显示&#xff0c;以及获取多边形的顶点和边的数据。 1.实现自定义多边形显示 Unity中MeshFilter是负责处理Mesh&#xff08;网格&#xff09;的信息的引用&#xff0c;MeshRender是渲…

电容如何能做升压?(电荷泵的工作原理及特性)

目录 一、电荷泵 二、电荷泵工作原理 1、 倍压型电荷泵 2、 稳压型电荷泵 1、 开关调整稳压型电荷泵 2、 LDO稳压型电荷泵 3、 反向型电荷泵 三、 电荷泵的优劣势 1&#xff09;成本 2&#xff09;效率 3&#xff09;噪声 4&#xff09;面积及EMI 5&#xff09;输…

apifox的使用以及和idea集成

apifox 简介 Apifox 是 API 文档、API 调试、API Mock、API 自动化测试一体化协作平台&#xff0c;定位 Postman Swagger Mock JMeter&#xff0c;由此可见apifox集功能于一身&#xff0c;极大的提升了我们开发的效率&#xff0c;不用再为postman网络连接失败而发愁&…

【Qt】对话框QDialog

文章目录 **对话框**QDialog**基本概念**对话框分类标准对话框自定义消息框模态对话框非模态对话框 案例&#xff1a;点击新建按钮弹出对话框消息对话框其它标准对话框 对话框QDialog 基本概念 对话框是 GUI 程序中不可或缺的组成部分。很多不能或者不适合放入主窗口的功能组…

将 Ordinals 与比特币智能合约集成:第 3 部分

基于 Ordinals 的 BSV-20 同质化代币 之前&#xff0c;我们展示了如何将比特币智能合约与 Ordinals 集成&#xff0c;Ordinals 可以被视为链上的 NFT。 在本文中&#xff0c;我们将展示如何将它们与同质化代币&#xff08;即 BSV-20 代币&#xff09;集成。 我们仍然以拍卖为例…

【业务功能篇 131】23种设计模式介绍

第一章 设计模式概述 1.1 代码质量好坏如何评价? 要想学习设计模式呢 我们就必须搞清楚设计模式到底在我们的编程过程中起到了怎样的作用,在编程世界中它处在一个什么样的位置,它到底是一种抽象的设计思想,还是一套具体的落地方案. 在学习设计模式之前呢 我们需要了解一下 代…

【轻松玩转MacOS】故障排除篇

引言 在使用 MacOS 时&#xff0c;遇到故障是在所难免的。不要担心&#xff0c;这篇文章将为您提供一些常见的故障排除步骤&#xff0c;并介绍如何联系苹果的支持团队寻求帮助。让我们一起来看看吧&#xff01; 一、常见的故障排除步骤 1.1 网络连接问题 如果你发现你的Mac…

中兴路由器mesh组网设置分享!没想到居然这么简单!

前段时间忙了几天&#xff0c;总算是搬进新家了&#xff0c;因为新家比之前租的房子大了许多&#xff0c;所以之前用的路由器已经是力不从心了&#xff0c;我把它放大厅里&#xff0c;除了离大厅最近的一个房间有信号&#xff0c;其他两个房间的信号微乎其微&#xff0c;就算连…

接口自动化测试,如何实现多套环境的自动化测试?

在敏捷迭代的项目中&#xff0c;通常会将后台服务部署到多套测试环境。那么在进行接口自动化测试时&#xff0c;则需要将服务器的域名进行配置。使用一套接口测试脚本&#xff0c;通过切换域名地址配置&#xff0c;实现多套环境的自动化测试。 实战练习 分别准备两套测试环境…

【Python语义分割】Segment Anything(SAM)模型介绍安装教程

1 Segment Anything介绍 1.1 概况 Meta AI 公司的 Segment Anything 模型是一项革命性的技术&#xff0c;该模型能够根据文本指令或图像识别&#xff0c;实现对任意物体的识别和分割。这一模型的推出&#xff0c;将极大地推动计算机视觉领域的发展&#xff0c;并使得图像分割技…

【网络安全 ---- 靶场搭建】凡诺企业网站管理系统靶场详细搭建过程(asp网站,练习Access数据库的 sql注入)

一&#xff0c;资源下载 百度网盘资源下载链接&#xff1a;百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#xff0c;支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com…

离散型制造企业MES管理系统解决方案

随着制造业的快速发展&#xff0c;离散型制造企业面临着越来越多的挑战。多样性、生产批次、工序复杂性以及高度定制化等特点使得企业的生产管理变得越来越复杂。为了提高生产效率和管理效率&#xff0c;许多企业开始寻求合适的解决方案。本文将以离散型制造企业的特点为基础&a…

云剪辑解决方案,支持云端剪辑私有化部署

在当今的商业环境中&#xff0c;视频已经成为了企业宣传和品牌推广的重要工具。然而&#xff0c;视频制作技术开发部署的成本和复杂性却让许多企业望而却步。为了解决这个问题&#xff0c;美摄科技推出了云剪辑解决方案&#xff0c;这是一款专为企业设计的高效视频剪辑技术服务…

Vuex使用方式及异步问题处理

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 生活的理想&#xff0c;为了不断更新自己 ! 目录 1.Vuex简介&#xff1a; 2.vuex获取值 2.1安装 2.2.菜单栏 2.3.模块 2.4使用 3.改…

水声功率放大器的应用场景有哪些

水声功率放大器是一种特殊的放大器&#xff0c;它专门用于放大水声信号&#xff0c;广泛应用于水声通信、水声传感、声纳等领域。下面将详细介绍水声功率放大器的应用场景及其重要性。 水声通信是水声功率放大器最常见的应用场景之一。水声通信是利用水作为传输介质进行通信的一…

JavaScript Web APIs第四天笔记

Web APIs - 第4天 进一步学习 DOM 相关知识&#xff0c;实现可交互的网页特效 能够插入、删除和替换元素节点能够依据元素节点关系查找节点 日期对象 掌握 Date 日期对象的使用&#xff0c;动态获取当前计算机的时间。 ECMAScript 中内置了获取系统时间的对象 Date&#xff…

Restclient-cpp库介绍和实际应用:爬取www.sohu.com

概述 Restclient-cpp是一个用C编写的简单而优雅的RESTful客户端库&#xff0c;它可以方便地发送HTTP请求和处理响应。它基于libcurl和jsoncpp&#xff0c;支持GET, POST, PUT, PATCH, DELETE, HEAD等方法&#xff0c;以及自定义HTTP头部&#xff0c;超时设置&#xff0c;代理服…