179.二叉树:合并二叉树(力扣)

news2025/1/31 20:53:35

代码解决

/**
 * 二叉树节点的定义。
 * 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 {
public:
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        // 若root1为空,则返回root2
        if(root1 == nullptr) return root2;
        // 若root2为空,则返回root1
        if(root2 == nullptr) return root1;

        // 创建队列以存储两棵树的节点
        queue<TreeNode*> que;
        // 将两棵树的根节点入队
        que.push(root1);
        que.push(root2);

        // 逐层遍历树
        while(!que.empty()) {
            // 弹出队首的节点
            TreeNode* node1 = que.front();
            que.pop();
            TreeNode* node2 = que.front();
            que.pop();
            // 将对应节点的值相加
            node1->val += node2->val;

            // 若两节点都有左子节点
            if(node1->left != nullptr && node2->left != nullptr) {
                // 将左子节点入队
                que.push(node1->left);
                que.push(node2->left);
            }

            // 若两节点都有右子节点
            if(node1->right != nullptr && node2->right != nullptr) {
                // 将右子节点入队
                que.push(node1->right);
                que.push(node2->right);
            }

            // 若node1无左子节点但node2有,则将node2的左子节点赋给node1
            if(node1->left == nullptr && node2->left != nullptr) {
                node1->left = node2->left;
            }

            // 若node1无右子节点但node2有,则将node2的右子节点赋给node1
            if(node1->right == nullptr && node2->right != nullptr) {
                node1->right = node2->right;
            }
        } 
        // 返回合并后的树(root1)
        return root1;
    }
};
  1. 首先判断两棵树的根节点是否都为空,如果其中一棵为空,则返回另一棵。
  2. 初始化一个队列 que 用来存储两棵树的节点。
  3. 将两棵树的根节点加入队列。
  4. 当队列不为空时,进行遍历:
    • 从队列中取出两个节点,分别代表两棵树中的对应节点。
    • 将这两个节点的值相加。
    • 如果这两个节点都有左子节点,将左子节点加入队列。
    • 如果这两个节点都有右子节点,将右子节点加入队列。
    • 如果第一个节点有左子节点而第二个节点没有,将第一个节点的左子节点赋给第一个节点。
    • 如果第一个节点有右子节点而第二个节点没有,将第一个节点的右子节点赋给第一个节点。
  5. 遍历结束后,返回第一棵树的根节点。

递归 

/**
 * 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 {
public:
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) 
    {
        // 如果root1为空,则返回root2
        if(root1==nullptr) return root2;
        // 如果root2为空,则返回root1
        if(root2==nullptr) return root1;

        // 创建一个新节点,值为两个根节点值的和
        TreeNode* node=new TreeNode(0);
        node->val=root1->val+root2->val;

        // 递归合并左子树
        node->left=mergeTrees(root1->left,root2->left);
        // 递归合并右子树
        node->right=mergeTrees(root1->right,root2->right);

        // 返回合并后的根节点
        return node;
    }
};
  1. 首先判断两棵树的根节点是否为空,如果其中一个为空,则返回另一个。
  2. 创建一个新的树节点 node,其值为两棵原树的根节点值之和。
  3. 递归地合并两棵原树的左子树,并将合并后的节点作为新节点的左子节点。
  4. 递归地合并两棵原树的右子树,并将合并后的节点作为新节点的右子节点。
  5. 返回合并后的根节点。

这个算法的时间复杂度是 O(n),因为每个节点都会被访问一次,其中 n 是两棵树中节点数量的总和。空间复杂度也是 O(n),因为需要存储递归调用的栈。

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

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

相关文章

Pytorch--Convolution Layers

文章目录 1.nn.Conv1d2.torch.nn.Conv2d()3.torch.nn.ConvTranspose1d()3.torch.nn.ConvTranspose2d() 1.nn.Conv1d torch.nn.Conv1d() 是 PyTorch 中用于定义一维卷积层的类。一维卷积层常用于处理时间序列数据或具有一维结构的数据。 构造函数 torch.nn.Conv1d() 的语法如…

如何用Vue3构建一个交互式音乐播放器

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 Vue.js 开发音乐播放器卡片 应用场景 这款音乐播放器卡片旨在为音乐应用程序提供一个现代而交互式的用户界面。它包含诸如歌曲信息、播放进度条和控制按钮等关键功能。 基本功能 **歌曲信息显示&#xff1a…

Xinstall:解决App安装跳转难题,让你的用户流畅体验不再受阻

在互联网流量红利逐渐衰退的今天&#xff0c;App推广和运营面临着前所未有的挑战。如何确保在多变的互联网环境下&#xff0c;迅速搭建起能时刻满足用户需求的运营体系&#xff0c;已经成为众多企业急待解决的问题。今天&#xff0c;我们就来探讨一下如何通过Xinstall的安装跳转…

软件工程期末复习题

目录 选择 判断 选择 下列说法中正确的是 ( B )。 A、20 世纪50 年代提出了软件工程的概念摇 B、20 世纪60 年代提出了软件工程的概念 C、20 世纪70 年代出现了客户端/ 服务器技术 D、20 世纪80 年代软件工程学科达到成熟 软件危机的主要原因是 ( D )。 A、软件工具落后…

电子画册制作与传统画册相比,有哪些优势?

在当今数字化时代&#xff0c;电子画册作为一种新兴的媒体形式&#xff0c;其制作与传统画册相比具有显著的优势。以下是对这些优势的详细探讨。 首先&#xff0c;电子画册的制作过程通常更加便捷和经济。相较于传统画册需要经历的繁琐的印刷过程&#xff0c;电子画册的制作大多…

RocketMQ教程(八):RocketMQ的集群搭建

集群架构 RocketMQ 的各个组件都可以搭建成集群部署,Broker 还可以搭建成主从架构,下面介绍的主要是 Broker 集群。 数据复制策略 复制策略是Broker的Master与Slave间的数据同步方式。分为同步复制与异步复制: 同步复制 消息写入master后,master会等待slave同步数据成…

【C++】——继承(详解)

一 继承的定义和概念 1.1 继承的定义 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保 持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类&#xff0c;被继承的称为基类…

wordpress主题开发

科普一&#xff1a;wordpress 是一套用 php 这个语言写的CMS后台管理系统&#xff0c;即我们大家的 wordpress 网站后台是一样的&#xff0c;能体现我们网站外观不同的地方就在于wordpress主题&#xff08;即皮肤&#xff09;&#xff0c;而这个主题的基本构成是 htmlcssjavasc…

使用Python爬取temu商品与评论信息

【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作&#xff01; 【&…

javaWeb项目-ssm+vue网上租车系统功能介绍

本项目源码&#xff1a;java-基于ssmvue的网上租车系统源码说明文档资料资源-CSDN文库 项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、…

系统运维联盟 5 月会议召开,围绕“进展、规划与合作”展开讨论

2024 年 5 月 28 日&#xff0c;龙蜥社区系统运维联盟&#xff08;SOMA&#xff0c;以下简称“运维联盟”&#xff09;月度会议于线上召开&#xff0c;12 家运维联盟单位、 20 位代表出席&#xff0c;缺席 1 家。本次会议由龙蜥社区运营委员会副主席、运维联盟秘书处负责人金美…

openh264 编码器源码分析:AnalyzePictureComplexity 函数

介绍 文件位置&#xff1a; openh264/codec/processing/src/complexityanalysis/ComplexityAnalysis.cpp 功能&#xff1a; 作为CWelsPreProcess类中一个方法&#xff0c;用来分析当前图像与参考图像之间的复杂度关系&#xff0c;以便编码策略。 原型&#xff1a; void CWels…

为什么要学习Flink系统管理及优化课程?

Flink系统是一种流式处理框架&#xff0c;能够高效地处理大规模数据流。然而&#xff0c;要确保Flink系统的正常运行&#xff0c;就需要进行系统管理和优化。系统管理是指对Flink集群的监控、调度和维护&#xff0c;而系统优化则是指通过调整参数和优化算法&#xff0c;提高Fli…

Class-Aware Self-Distillation for Remote SensingImage Scene Classification

这篇文章提出了一种新的蒸馏方式&#xff0c;由于遥感场景图像具有类间相似性和类内多样性的特点&#xff0c;这篇文章试图解决这个问题。通过三个共享权重的分支&#xff0c;同时输入三张图片&#xff0c;其中两张类别相同的图片&#xff0c;一张类别不同但地物特征相似的图片…

Go变量作用域精讲及代码实战

1. 变量的作用域概述 在编程中&#xff0c;变量的作用域&#xff08;Scope&#xff09;定义了变量在程序中的可见性和生命周期。理解变量的作用域对于编写健壮且可维护的代码至关重要。Go语言&#xff08;简称Go&#xff09;提供了几种不同的作用域类型&#xff0c;使得开发者可…

腾讯云SSL证书获取及Nginx配置教程

前言 很多人应该都有属于自己网站,刚开始基本是只能用http进行访问,无法使用https安全访问,但是随着网络安全意识的不断提高,越来越多的网站开始使用HTTPS协议来保护用户的数据安全,SSL证书是实现HTTPS协议的关键组件,本文将讲解如何在腾讯云上获取SSL证书,并配置到Ngi…

为什么要做数字化转型?数字化转型对企业的意义?

本人研究企业数字化转型9年多&#xff0c;为企业软件选型、数字化提供咨询服务&#xff01;目前重点研究低代码数字化转型玩法&#xff0c;力争为各行各业探索出一条最具性价比的数字化方式。 【织信低代码】数字化系统一体化的定制开发工具。 什么是数字化转型&#xff0c;为什…

【教程】从0开始搭建大语言模型:实现Attention机制

从0开始搭建大语言模型 从0开始搭建大语言模型&#xff1a;实现Attention机制建模长序列存在的问题使用attention机制获得数据间的依赖Self-attention介绍带有可训练权重的self-attention1.生成Q&#xff0c;K&#xff0c;V变量2.计算attention score3.attention weight的获得4…

《网络反不正当竞争规定》9月1日实施,这两类欺诈被重点关注

近日&#xff0c;国家市场监督管理总局公布《网络反不正当竞争暂行规定》 &#xff0c;自2024年9月1日起施行。《网络反不正当竞争暂行规定》是为预防和制止网络不正当竞争行为&#xff0c;维护公平竞争的市场秩序&#xff0c;鼓励创新&#xff0c;保护经营者和消费者的合法权益…

【Unity】Inspector排版扩展学习初探

一、简单的Unity Inspector扩展 [SerializeField] [SerializeField] 作用&#xff1a;让private属性也可以显示在面板上 [Range(x , y)] [Range(x , y)] 作用&#xff1a; 让参数从输入框变为范围滑条 [Header(" 标题 ")] [Header(" 标题 ")]作用&am…