LeetCode题解 二叉树(十):654 最大二叉树;617合并二叉树

news2024/9/28 1:23:02

654 最大二叉树 medium

给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:

  • 二叉树的根是数组中的最大元素。
  • 左子树是通过数组中最大值左边部分构造出的最大二叉树。
  • 右子树是通过数组中最大值右边部分构造出的最大二叉树。

通过给定的数组构建最大二叉树,并且输出这个树的根节点。

示例 :

654.最大二叉树

这道题和此前的根据中序+后序/前序构造二叉树略有不同,而是只给出了一个序列,需要我们自己选取遍历方式

因为题目要从根结点开始构造,那么就要选用“前序遍历”,中左右的顺序,先选取根结点

使用递归法,返回值必然是结点类型,作为主函数的返回结果,而传入参数,根据此前构造二叉树的算法,应当传入此次使用到的序列的范围,以减少构造数组的占用的时间与空间

返回条件就是数组范围等于1的时候,说明只有一个结点需要入树;

每次递归的逻辑处理条件,要先找到本次传入数组中的最大值的索引值,作为中间结点和分割点序列,左区间用于构造左子树,右区间用于构造右子树

最终代码如下:

TreeNode* reversal(vector<int>& nums, int begin, int end) {
    if (begin >= end) return nullptr;
    int maxValueIndex = begin;
    for (int i = begin + 1; i < end; i++) {
        if (nums[i] > nums[maxValueIndex])
            maxValueIndex = i;
    }

    TreeNode* root = new TreeNode(nums[maxValueIndex]);
    // 左闭右开:[left, maxValueIndex)
    root->left = reversal(nums, begin, maxValueIndex);

    // 左闭右开:[maxValueIndex + 1, right)
    root->right = reversal(nums, maxValueIndex + 1, end);

    return root;
}

TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
    // 左闭右开
    return reversal(nums, 0, nums.size());
}

617 合并二叉树 easy

给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。

你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。

这道题和此前题目的不同之处就在于,这次是遍历两棵二叉树

递归法,返回值是结点类型,传入参数为两个二叉树的结点

返回条件也很简单,要判断两个结点是否为空,其中一个为空,就返回另一个,如果两个都为空,也可以返回另一个,结果是一样的。

处理逻辑就是创建一个新的结点,然后将遍历到的两个结点值相加。

以下是递归法的代码:

TreeNode* reversal(TreeNode* root1, TreeNode* root2) {
    if (!root1) return root2;
    if (!root2) return root1;

    TreeNode* root = new TreeNode(0);
    root->val = root1->val + root2->val;
    root->left = reversal(root1->left, root2->left);
    root->right = reversal(root1->right, root2->right);

    return root;
}

TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
    return reversal(root1, root2);
}

这道题使用迭代法也是可以的,随想录中给出的方法是层序遍历(但我觉得正常的深度遍历也是可以的,就是会稍微麻烦些),层序遍历代码如下:

TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
    queue<TreeNode*> que;
    if (!root1) return root2;
    if (!root2) return root1;
    que.push(root1);
    que.push(root2);

    while (!que.empty()) {
        TreeNode *cur1 = que.front();que.pop();
        TreeNode *cur2 = que.front();que.pop();

        cur1->val += cur2->val;

        if (cur1->left != nullptr && cur2->left != nullptr) {
            que.push(cur1->left);
            que.push(cur2->left);
        }
        if (cur1->right != nullptr && cur2->right != nullptr) {
            que.push(cur1->right);
            que.push(cur2->right);
        }
        if (cur1->left == nullptr && cur2->left != nullptr) {
            cur1->left = cur2->left;
        }
        if (cur1->right == nullptr && cur2->right != nullptr) {
            cur1->right = cur2->right;
        }
    }

    return root1;
}

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

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

相关文章

RHCEansible 编写playbook---yaml

YAML 语言特性 YAML的可读性好 YAML和脚本语言的交互性好 YAML使用实现语言的数据类型 YAML有一个一致的信息模型 YAML易于实现 YAML可以基于流来处理 YAML表达能力强&#xff0c;扩展性好YAML的三种数据结构 对象&#xff1a; 键值对的集合&#xff0c;又称为映射、哈希、字典…

Map数据结构详解

Map Object本质上是键值对的集合&#xff08;Hash结构&#xff09;&#xff0c;但Object只能将字符串当做键&#xff0c;这就给Object带来了很大的限制。 let data {} let s {name : 东方不败} data[s] 西方求败// 如果键传入非字符串的值&#xff0c;会自动为字符串 cons…

思科路由器DHCPv6服务配置

配置如下 Router>ena Router#conf t Router(config)#host R1 R1(config)#ipv6 unicast-routing R1(config)#int g0/0 R1(config-if)#ipv6 add 2001:1::1/64 R1(config-if)#no sh R1(config-if)#exit R1(config)#service dhcp R1(config)#ipv6 local pool v6pool …

CTF中的PHP特性函数(中)

前言 上篇文章给大家带来了PHP中最基本的特性&#xff0c;不知道大家学习的怎样了&#xff0c;回顾上文&#xff0c;我们讲了MD5强弱碰撞以及正则匹配的绕过&#xff0c;总体来看还是很简单的&#xff0c;下面给大家带来新的PHP特性讲解&#xff0c;会稍微比上一篇难一些。 i…

开源工作流引擎如何支撑企业级 Serverless 架构?

作者&#xff1a;董天欣&#xff08;雾雾&#xff09; Serverless 应用引擎&#xff08;SAE&#xff09;是一款底层基于 Kubernetes&#xff0c;实现了 Serverless 架构与微服务架构结合的云产品。作为一款不断迭代的云产品&#xff0c;在快速发展的过程中也遇到了许多挑战。如…

2022年统一大市场研究报告

第一章 行业概况 国内统一大市场指的是在全国范围内&#xff0c;在充分竞争以及由此形成的社会分工基础上&#xff0c;各地区市场间、各专业市场间形成了相互依存、相互补充、相互开放、相互协调的有机的市场体系。在这种市场体系下&#xff0c;商品和要素能够按照价格体系的调…

干货 | 在Docker 上搭建持续集成平台 Jenkins

Docker是一个开源的应用容器引擎&#xff0c;基于 Go 语言开发&#xff0c;Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的系统。Docker 是世界领先的软件容器平台&#xff0c;Docker 官方的口号是”调试你的应用&…

Three.js学习(二)three.js的一些基本操作

文章目录1.鼠标操作三维场景旋转、移动和缩放2.场景中添加新的三维图形3.设置材质效果4.光源效果1.鼠标操作三维场景旋转、移动和缩放 使用THREE的OrbitControls控件&#xff0c;可以实现鼠标控制三维图形的操作。主要是通过监听鼠标操作&#xff0c;控制相机的三维参数。 imp…

python数据分析-matplotlib、numpy、pandas

数据分析概述数据分析就是用适当的方法对收集来的大量数据进行分析&#xff0c;帮助人们在一处判断&#xff0c;以便采取适当行动数据分析流程jupyter notebook说明matplotlib&#xff1a;Matplotlib — Visualization with Python基本要点能将数据进行可视化&#xff0c;更直观…

docker基本命令演示

docker拉取redis镜像演示首先前往&#xff1a;https://hub.docker.com找到需要的redis镜像然后 点击之后使用命令 docker pull redis 拉取redis 成功之后使用命令 docker images 查看本地的镜像使用命令导出镜像到指定文件 docker save -o redis.tar redis:latestdocker save…

Android13适配

遇到的一些问题 1.WebChromeClient的 API onReachedMaxAppCacheSize 没了 onReachedMaxAppCacheSize overrides nothing // 扩充缓存的容量override fun onReachedMaxAppCacheSize(spaceNeeded: Long, totalUsedQuota: Long, quotaUpdater: QuotaUpdater) {quotaUpdater.upda…

QT学习笔记(下)

项目实践 前言 本项目的实践主要是以翻金币的项目为例&#xff0c;进行QT项目的实践。游戏分为3个场景&#xff0c;分别是mainscene主场景、chooselevelscene选择关卡场景、playscene游戏场景&#xff0c;以上的三个场景是按顺序实现的。并且定义了两个自定义的QPushButton按…

数据库,计算机网络、操作系统刷题笔记24

数据库&#xff0c;计算机网络、操作系统刷题笔记24 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle…

c++下 ADO+配置数据源连接oracle数据库

测试环境&#xff1a;在本地局域网内远程连接服务器端的oracle数据库&#xff0c;VS2013、ADO方式。2、本地安装oracle数据库客户端&#xff0c;具体是安装32位还是64位的数据库客户端&#xff0c;取决于我们编译的程序是32位的还是64位的&#xff08;和计算机的系统位数没有关…

首款通过! 机器学习服务活体检测算法荣获CFCA权威安全认证

随着人脸识别技术在金融、医疗等多个领域的加速落地&#xff0c;网络安全、信息泄露等问题愈为突出&#xff0c;用户对应用稳定性和安全性的要求也更为严格。为保障各行业高效稳定的开展业务&#xff0c;提前发现和应对潜在安全风险&#xff0c;华为 HMS Core 机器学习服务&…

【回答问题】ChatGPT上线了!给我推荐20个比较流行的图神经网络模型

给我推荐20个比较流行的图神经网络模型 很高兴为您推荐流行的图神经网络模型。这里是我的推荐列表&#xff1a; 卷积神经网络 (CNN) 递归神经网络 (RNN) 自注意力机制 (Transformer) 双向递归神经网络 (BRNN) 门控循环单元 (GRU) 长短期记忆网络 (LSTM) 双流图神经网络 (Bi-D…

鲁大师2022牛角尖颁奖盛典落幕,年度最强产品揭晓!

1月4日&#xff0c;鲁大师2022年度牛角尖颁奖晚会在湖北襄阳成功举办。鲁大师的”牛角尖”奖是由过去一年上亿用户通过鲁大师测试得到的真实数据&#xff0c;以及鲁大师实验室通过专业的测试规范共同缔造的硬件奖项。颁发给的都是各大PC、手机、电动车领域最优秀、最顶尖的产品…

JAVA 的内存泄露分析

背景 前不久&#xff0c;上线了一个新项目&#xff0c;这个项目是一个压测系统&#xff0c;可以简单的看做通过回放词表&#xff08;http请求数据&#xff09;&#xff0c;不断地向服务发送请求&#xff0c;以达到压测服务的目的。在测试过程中&#xff0c;一切还算顺利&#x…

统一网关Gateway

网关功能&#xff1a; 身份验证、权限校验服务路由、负载均衡请求限流 网关实现技术&#xff1a; gatewayzuul Zuul是基于Servlet的实现&#xff0c;属于阻塞式编程。而SpringCloudGateway则是基于Spring5中提供的WebFlux&#xff0c;属于响应式编程的实现&#xff0c;具备更…

Servlet 综合案例(empProject)

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java案例分…