617、合并二叉树

news2024/11/29 4:37:37

1、题目描述

. - 力扣(LeetCode)

规则:一个二叉树覆盖到另一颗二叉树上。

(1)重复的节点就将节点值做累加  (2)不重复的节点就取并集。

最终得到一个全新的二叉树,如下图所示。

2、分析

分析:也属于构造二叉树,还是采用前序遍历递归遍历即可。

class Solution {
public:
    //1.递归函数的入参返回值采用这个就好(入参肯定是两颗二叉树的相同位置节点)
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        //2.函数内首先要明确退出条件(注:这里都换成if……elseif也都是可以的)
        //①两个条件都为空就返回空 ②一个空一个不空就返回不空的节点 ③都不空应当作为中间节点处理逻辑
        if(!root1 && !root2) return NULL;
        if(!root1 && root2) return root2;
        if(root1 && !root2) return root1;
        //3.接下来就是都不为空了
        int new_val = root1->val + root2->val;
        TreeNode* root = new TreeNode(new_val);
        //4.递归地处理左右子树
        root->left = mergeTrees(root1->left, root2->left);
        root->right = mergeTrees(root1->right, root2->right);
        return root;
    }

    void levelorder(TreeNode* root){
        queue<TreeNode*> que;
        que.push(root);
        while(!que.empty()){
            int level_size = que.size();
            for(int i = 0; i < level_size; i++){
                TreeNode* tmp = que.front();
                cout << tmp->val << ",";
                que.pop();
                if(tmp->left) que.push(tmp->left);
                if(tmp->right) que.push(tmp->right);
            }
            cout << endl;
        }
    }
};

我们可以在上面的基础上继续做一些优化。优化点及优化后的代码如下。

(1)退出条件不用这么复杂,谁为空我就用另一个就好。

(2)其实不用去构造一个全新的二叉树就在root1的基础上改即可。

class Solution {
public:
    //1.递归函数的入参返回值采用这个就好(入参肯定是两颗二叉树的相同位置节点)
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        //2.函数内首先要明确退出条件(①root1为空就返回root2 ②root2为空就返回root1)
        if(!root1) return root2;
        if(!root2) return root1;
        //3.接下来就是都不为空(在root1的基础上改就好)
        root1->val += root2->val;
        //4.递归地处理左右子树
        root1->left = mergeTrees(root1->left, root2->left);
        root1->right = mergeTrees(root1->right, root2->right);
        return root1;
    }
};

3、实现代码

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <math.h>

using namespace std;


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:
    //1.递归函数的入参返回值采用这个就好(入参肯定是两颗二叉树的相同位置节点)
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        //2.函数内首先要明确退出条件(注:这里都换成if……elseif也都是可以的)
        //①两个条件都为空就返回空 ②一个空一个不空就返回不空的节点 ③都不空应当作为中间节点处理逻辑
        if(!root1 && !root2) return NULL;
        if(!root1 && root2) return root2;
        if(root1 && !root2) return root1;
        //3.接下来就是都不为空了
        int new_val = root1->val + root2->val;
        TreeNode* root = new TreeNode(new_val);
        //4.递归地处理左右子树
        root->left = mergeTrees(root1->left, root2->left);
        root->right = mergeTrees(root1->right, root2->right);
        return root;
    }

    void levelorder(TreeNode* root){
        queue<TreeNode*> que;
        que.push(root);
        while(!que.empty()){
            int level_size = que.size();
            for(int i = 0; i < level_size; i++){
                TreeNode* tmp = que.front();
                cout << tmp->val << ",";
                que.pop();
                if(tmp->left) que.push(tmp->left);
                if(tmp->right) que.push(tmp->right);
            }
            cout << endl;
        }
    }
};

int main()
{
    Solution s1;
    
    TreeNode* t1pnode4 = new TreeNode(5);//new创建指针
    TreeNode t1node2(3, t1pnode4, NULL);//创建对象
    TreeNode t1node3(2, NULL, NULL);//创建对象
    TreeNode root1(1, &t1node2, &t1node3);//创建对象
    
    TreeNode* t2pnode5 = new TreeNode(7);
    TreeNode* t2pnode4 = new TreeNode(4);
    TreeNode* t2pnode2 = new TreeNode(1);
    t2pnode2->right = t2pnode4;
    TreeNode t2node3(3,NULL,t2pnode5);
    TreeNode root2(2,t2pnode2, &t2node3);
    
    TreeNode* root = s1.mergeTrees(&root1, &root2);
    s1.levelorder(root);

}

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

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

相关文章

Llama 3.2 安卓手机安装教程

在刚刚结束的Meta开发者大会上&#xff0c;Llama 3.2惊艳亮相。此次&#xff0c;它不仅拥有多模态能力&#xff0c;还与Arm等公司合作&#xff0c;推出了专门针对高通、联发科硬件优化的“移动”版本。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 -…

Centos Stream 9备份与恢复、实体小主机安装PVE系统、PVE安装Centos Stream 9

最近折腾小主机&#xff0c;搭建项目环境&#xff0c;记录相关步骤 数据无价&#xff0c;丢失难复 1. Centos Stream 9备份与恢复 1.1 系统备份 root权限用户执行进入根目录&#xff1a; cd /第一种方式备份命令&#xff1a; tar cvpzf backup.tgz / --exclude/proc --exclu…

参数标准+-db和-db

-db是因为比值是相近的&#xff0c;值越进行越好&#xff0c;正负db代表两个值差异不大&#xff0c;可以分子比分母大或者分母比分子大-db代表串扰&#xff0c;分子比分母小&#xff0c;所以负db的值越小越好

探索 GraphRAG:从存储到查询,深入解析 NebulaGraph 与传统 SQL 的对比

近年来&#xff0c;图数据库逐渐成为大数据和人工智能领域的热议话题。特别是随着 GraphRAG 技术的火爆&#xff0c;如何高效存储和查询大规模图数据成为很多开发者关心的问题。出于好奇&#xff0c;我最近尝试了 GraphRAG 并研究其存储结构&#xff0c;因此决定进一步探索图数…

(笔记)第三期书生·浦语大模型实战营(十一卷王场)–书生基础岛第3关---浦语提示词工程实践

学员闯关手册&#xff1a;https://aicarrier.feishu.cn/wiki/ZcgkwqteZi9s4ZkYr0Gcayg1n1g?open_in_browsertrue 课程视频&#xff1a;https://www.bilibili.com/video/BV1cU411S7iV/ 课程文档&#xff1a; https://github.com/InternLM/Tutorial/tree/camp3/docs/L1/Prompt 关…

2024年最新大模型LLM学习路径全解析!看完你就是LLM大师

ChatGPT的出现在全球掀起了AI大模型的浪潮&#xff0c;2023年可以被称为AI元年&#xff0c;AI大模型以一种野蛮的方式&#xff0c;闯入你我的生活之中。 从问答对话到辅助编程&#xff0c;从图画解析到自主创作&#xff0c;AI所展现出来的能力&#xff0c;超出了多数人的预料&…

aws(学习笔记第二课) AWS SDK(node js)

aws(学习笔记第二课) 使用AWS SDK&#xff08;node js&#xff09; 学习内容&#xff1a; 使用AWS SDK&#xff08;node js&#xff09; 1. AWS SDK&#xff08;node js&#xff09; AWS支持多种SDK开发(除了AWS CLI&#xff0c;还支持其他的SDK) AndroidPythonNode.js(Javas…

【梯级水电站调度优化】基于标准粒子群

课题名称&#xff1a; 基于标准粒子群算法的梯级水电站调度优化 代码获取方式&#xff08;付费&#xff09;&#xff1a; 相关资料&#xff1a; 1. 粒子群算法的基本原理 2. 梯级水电站调度优化模型 3. 代码注释 4. 代码讲解视频&#xff08;个人录制&#xff09; 程序实…

【电路笔记】-运算放大器微分器

运算放大器微分器 文章目录 运算放大器微分器1、概述2、运算放大器微分器的表示2.1 理想微分器2.2 输出公式2.3 交流分析3、实际微分器3.1 理想配置的局限性3.2 带串联电阻的伪微分器3.3 具有并联电容器的伪微分器4、总结1、概述 在我们之前关于积分器运算放大器的文章中,我们…

数据库概述(3)

课程主页&#xff1a;Guoliang Li Tsinghua 继续补充DBMS概况&#xff1a; DBMS概况 存储管理层 缓冲区管理 为了持久保存数据库里面的数据&#xff0c;必定要做持久化技术&#xff0c;也就是会用到磁盘&#xff0c;然而磁盘读取数据的速度是比较慢的&#xff0c;一般是毫…

港股大跌敲响警钟

10月3日&#xff0c;港股早间突如其来的下跌一度登上热搜榜&#xff0c;而午后回暖的恒指则一度抹去跌幅持平。截至当日收盘&#xff0c;恒指跌1.47%&#xff0c;报22&#xff0c;113.51点&#xff0c;守住了22000点关口&#xff1b;恒生科技指数跌、跌3.46%&#xff0c;报4978…

好用耐用充电宝品牌有哪些?推荐2024年热门款充电宝

作为一位热衷于探索各种数码产品的测评博主&#xff0c;今天我又来给大家带来满满的干货啦&#xff01;在这个智能手机不离手的年代&#xff0c;拥有一款好用耐用的充电宝简直就成了出行必备。那么&#xff0c;在众多品牌和型号中&#xff0c;哪些充电宝真正值得我们入手呢&…

机器学习系列篇章0 --- 人工智能机器学习相关概念梳理

说明 人工智能(Artificial Intelligence, AI)是大势所趋&#xff0c;我们正处于一个AI开始大爆发的时代&#xff0c;基于AI的各类工具在科研、生产、生活各方各面给我们带来了巨大的便利和影响(好的以及坏的)&#xff0c;有关AI的一切我们不可不察。 我并非计算机这个行当的科…

msvcp140dll丢失是怎回事,对比哪种解决方法更简单有效

1. msvcp140.dll 简介 1.1 定义与作用 msvcp140.dll 是 Microsoft Visual C 2015 Redistributable Package 的一部分&#xff0c;它包含了 C 运行时库的函数和类&#xff0c;这些库是支持 Windows 应用程序运行的关键组件。msvcp140.dll 文件提供了对 C 程序中常用的功能的支…

Jedis多线程环境报错:redis Could not get a resource from the pool 的主要原因及解决办法。

本篇文章主要讲解&#xff0c;Jedis多线程环境报错&#xff1a;redis Could not get a resource from the pool 的主要原因及解决办法。 作者&#xff1a;任聪聪 日期&#xff1a;2024年10月6日01:29:21 报错信息&#xff1a; 报文&#xff1a; redis Could not get a resou…

影刀RPA实战:Excel密码与字典功能指令

1.实战目标 本次主要讲解下影刀RPA操作Excel密码保护和数据列生成字典&#xff0c;在工作中&#xff0c;我们经常会遇到合作公司给我们发的表格&#xff0c;或是电商平台下载订单Excel数据表都带有密码&#xff0c;这在自动化处理过程中&#xff0c;多少带来不变&#xff0c;影…

cnn突破五(公式)

三层网络反向传播公式推导&#xff1a; X【196】-》HI【80】/HO【80】-》YI【10】/YO【10】&#xff0c;期望是d【10】 X&#xff0c;HI之间用w1【196&#xff0c;80】 HO&#xff0c;YI之间用w2【80,10】 k10;j80;i196 (yo[k]-d[k])*ds(yo[k])*ho[j]; (yo[k]-d[k])*ds(yo[…

双十一哪些东西会打折?入手哪些东西是最明智的?这些好物闭眼入

​随着双十一购物狂欢节的脚步越来越近&#xff0c;我们即将迎来一年一度的购物盛宴。在这个充满折扣和优惠的季节&#xff0c;如何巧妙地选购心仪商品&#xff0c;同时避免落入消费陷阱&#xff0c;成为了每个购物者需要思考的问题。为了帮助大家在双十一期间做出明智的购物决…

Sora文本生成视频模型

一、引言 2024年2月16日&#xff0c;OpenAI发布Sora文生视频模型&#xff0c;犹如一石激起千层浪&#xff0c;迅速刷屏爆火于整个AI圈。这是ChatGPT掀起Gen AI热潮时隔一年后&#xff0c;OpenAI再次史诗级的更新。一方面&#xff0c;Sora从文本、图像迈向视频大模型&#xff0…

javaScript基础(8个案例+代码+效果图)

目录 1.js常用的输出语句 案例:js初体验 1.代码 2.效果 2.js命名规则 3.js赋值 var 关键字声明变量 案例:交换两个变量的内容 完整代码 效果 4.js数据类型 布尔类型 整数 浮点数 字符串 空型 未定义型 5. 数据检测 6.算术运算符 7.比较运算符 案例:计算圆周长和面积 1.代码 2.…