LeetCode 热题100(八)【二叉树】(3)

目录

8.11二叉树展开为链表(中等)

8.12从前序与中序遍历序列构造二叉树(中等)

8.13路径总和III(中等)

8.14二叉树的最近公共祖先(中等)

8.15二叉树中的最大路径和(困难)

8.11二叉树展开为链表(中等)

题目描述:leetcode链接 114. 二叉树展开为链表

给你二叉树的根结点 root ,请你将它展开为一个单链表:

  • 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
  • 展开后的单链表应该与二叉树 先序遍历 顺序相同。

示例 1:

输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [0]
输出:[0]

思路:

1.将左、右子树分别变为链表L和R

2.根节点的右节点变为L的根节点,根节点的左节点为空

3.L尾节点的右节点变为R的根节点

举例说明:

见上图

代码:

class Solution {
public:void flatten(TreeNode* root) {if (!root) return;flatten(root -> left);flatten(root -> right);TreeNode* temp = root -> right;root -> right = root -> left;root -> left = nullptr;while(root -> right) root = root -> right;root -> right = temp;}
};

8.12从前序与中序遍历序列构造二叉树(中等)

题目描述:leetcode链接 105. 从前序与中序遍历序列构造二叉树

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

示例 1:

输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]

示例 2:

输入: preorder = [-1], inorder = [-1]
输出: [-1]

思路:

1.由于前序遍历的顺序是【根-左子树-右子树】,中序遍历的顺序是【左子树-根-右子树】,所以由上图的前序遍历preorder可知,它的第一个元素3为根节点。那么由中序遍历inorder可知根节点3的左侧元素为左子树,共1个元素;根节点3的右侧元素为右子树,共3个元素。

2.记录3的左子树的前序遍历顺序和中序遍历顺序,其中9即为3的左节点

记录3的右子树的前序遍历顺序和中序遍历顺序,其中20即为3的右节点

3.记录20的左子树的前序遍历顺序和中序遍历顺序,其中15即为20的左节点

记录20的右子树的前序遍历顺序和中序遍历顺序,其中7即为20的右节点

举例说明:

见上图

代码:

class Solution {
public:unordered_map<int, int> mp;TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {int n = preorder.size();for (int i = 0; i < n; i++) {mp[inorder[i]] = i;}return build(preorder, inorder, 0, n - 1, 0, n - 1);}TreeNode* build(vector<int>& preorder, vector<int>& inorder, int pre_l, int pre_r, int in_l, int in_r) {if (pre_l > pre_r) return nullptr;//前序遍历中的根节点位置int pre_root = pre_l;//中序遍历中的根节点位置int in_root = mp[preorder[pre_root]];TreeNode* root = new TreeNode(preorder[pre_root]);//左子树节点个数int size_l = in_root - in_l;//构造左右子树root -> left = build(preorder, inorder, pre_root + 1, pre_root + size_l, in_l, in_root - 1);root -> right = build(preorder, inorder, pre_root + size_l + 1, pre_r, in_root + 1, in_r);return root;}
};

8.13路径总和III(中等)

题目描述:leetcode链接 437. 路径总和 III

给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。

路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

示例 1:

输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
输出:3
解释:和等于 8 的路径有 3 条,如图所示。

示例 2:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:3

思路:

        和560. 和为K的子数组类似,使用前缀和+哈希表的方式来解决,只不过我们现在面对的数据是存储在二叉树里面了

注:unordered_map<long, int> mp和long sum的类型为long,要不然有几个测试用例通过不了

举例说明:

代码:

class Solution {
public:int ans = 0;unordered_map<long, int> mp;int pathSum(TreeNode* root, int targetSum) {mp[0] = 1;dfs(root, targetSum, 0);return ans;}void dfs(TreeNode* root, int targetSum, long sum) {if (!root) return;sum += root -> val;if (mp.find(sum - targetSum) != mp.end()) ans += mp[sum - targetSum];mp[sum]++;dfs(root -> left, targetSum, sum);dfs(root -> right, targetSum, sum);mp[sum]--;}
};

8.14二叉树的最近公共祖先(中等)

题目描述:leetcode链接 236. 二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

示例 1:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释:节点5和节点1的最近公共祖先是节点3

示例 2:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出:5
解释:节点5和节点4的最近公共祖先是节点5。因为根据定义最近公共祖先节点可以为节点本身。

示例 3:

输入:root = [1,2], p = 1, q = 2
输出:1

思路:

        按照p、q中一节点是否是另一节点的祖先节点可以分为上图两种情况 。

        使用递归,分以下几种情况讨论:

1.如果当前节点为空,或者等于p,或者等于q,返回当前节点

2.如果当前节点左、右子树均不返回空,返回当前节点

3.如果当前节点左子树返回不为空,右子树为空,返回左子树递归结果

4.如果当前节点右子树返回不为空,左子树为空,返回右子树递归结果

5.如果当前节点左、右子树均返回空,返回空

举例说明:

代码:

class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if (!root || root == p || root == q) {return root;}TreeNode* L = lowestCommonAncestor(root -> left, p, q);TreeNode* R = lowestCommonAncestor(root -> right, p, q);if (L && R) return root;return L ? L : R;}
};

8.15二叉树中的最大路径和(困难)

题目描述:leetcode链接 199. 二叉树中的最大路径和

二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。

路径和 是路径中各节点值的总和。

给你一个二叉树的根节点 root ,返回其 最大路径和 。

示例 1:

输入:root = [1,2,3]
输出:6
解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6

示例 2:

输入:root = [-10,9,20,null,null,15,7]
输出:42
解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42

思路:

1.定义一个函数getNum(TreeNode* root),可以计算root节点的贡献值

贡献值可以理解为以该节点为起点,在其子树中寻找一条路径,使其路径和最大

对空节点而言,getNum(NULL)=0

2.以下图为例,

根节点-10的路径和ans(-10)= -10+max(getNum(15), 0)+max(getNum(-5), 0)

遍历所有节点,其中ans的最大值即为二叉树的最大路径和

举例说明:

代码:

class Solution {
public:int ans = INT_MIN;int maxPathSum(TreeNode* root) {getNum(root);return ans;}int getNum(TreeNode* root){if (!root) return 0;int L = max(getNum(root -> left), 0);int R = max(getNum(root -> right), 0);ans = max(ans, root -> val + L + R);return root -> val + max(L, R);}
};

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

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

相关文章

nginx配置负载均衡详解

在现代的 web 应用中&#xff0c;负载均衡是确保高可用性、可扩展性和稳定性的关键技术之一。Nginx 是一个非常流行的反向代理服务器和负载均衡器&#xff0c;它支持多种负载均衡策略&#xff0c;能够帮助将客户端的请求分发到多个后端服务器&#xff0c;以提高系统的整体性能和…

AutoSAR CP DoIP规范导读

主要功能和用途 诊断通信协议实现 遵循标准&#xff1a;遵循ISO 13400 - 2标准&#xff0c;实现了诊断通信在IP网络上的传输协议和网络层服务&#xff0c;包括数据封装、传输、路由等功能。 多种消息支持 车辆识别与公告&#xff1a;能够进行车辆识别请求和响应&#xff0c;…

sqlsever 分布式存储查询

当数据存储在不同的服务器上的时候怎么取出来进行正常管连呢?比如你有 A 和B 两个服务器 里面存有两个表 分别是 A_TABLE、B_TABLE 其中 他们的关联关系是 ID 互相关联 1.创建链接服务器如果在B数据库要访问A数据库 那么 就在B数据库创建 -- 创建链接服务器 EXEC sp_addlink…

Simulink中Matlab function使用全局变量

目录 一. 引言二. 普通Matlab function使用全局变量三. Simulink中的Matlab function使用全局变量四. 如何利用Matlab function的全局变量施加随机噪声 一. 引言 最近发现了之前仿真中的一个问题&#xff0c;记录一下备忘。 Matlab function中有时候需要用到全局变量&#xf…

屏幕缩放后截屏图片尺寸数字偏大导致前端DOM尺寸设置失真问题

如果显示器的尺寸缩放&#xff0c;而不是100%的话&#xff0c;利用截屏软件截取屏幕中的区域&#xff0c;截取时读取到的区域尺寸&#xff0c;就会失真&#xff1b;如果使用这个尺寸去设置网页中的DOM&#xff0c;则Dom的尺寸也会跟着失真。 比如&#xff0c; 如果使用失真…

蓝桥杯每日真题 - 第7天

题目&#xff1a;&#xff08;爬山&#xff09; 题目描述&#xff08;X届 C&C B组X题&#xff09; 解题思路&#xff1a; 前缀和构造&#xff1a;为了高效地计算子数组的和&#xff0c;我们可以先构造前缀和数组 a&#xff0c;其中 a[i] 表示从第 1 个元素到第 i 个元素的…

给阿里云OSS绑定域名并启用SSL

为什么要这么做&#xff1f; 问题描述&#xff1a; 当用户通过 OSS 域名访问文件时&#xff0c;OSS 会在响应头中增加 Content-Disposition: attachment 和 x-oss-force-download: true&#xff0c;导致文件被强制下载而不是预览。这个问题特别影响在 2022/10/09 之后新开通 OS…

CTF-WEB:PHP伪协议用法总结

php:// 伪协议&#xff1a; php:// 是 PHP 中的一个虚拟协议&#xff08;或称为流包装器&#xff09;&#xff0c;用于访问 PHP 内部流资源。它是 PHP 提供的内置流协议之一&#xff0c;允许你通过流&#xff08;stream&#xff09;方式访问 PHP 内部的数据流、文件或其他资源…

电脑浏览器打不开网页怎么办 浏览器无法访问网页解决方法

我们在使用电脑的时候&#xff0c;使用浏览器是经常的&#xff0c;很多用户在点开浏览器时&#xff0c;却遇到浏览器无法访问网页的情况。那么电脑浏览器打不开网页是什么原因呢&#xff1f;今天小编就给大家分享几个常见的原因和具体的解决方法&#xff0c;希望能对大家有所帮…

(干货)Jenkins使用kubernetes插件连接k8s的认证方式

#Kubernetes插件简介 Kubernetes 插件的目的是能够使用 Kubernetes 配合&#xff0c;实现动态配置 Jenkins 代理&#xff08;使用 Kubernetes 调度机制来优化负载&#xff09;&#xff0c;在执行 Jenkins Job 构建时&#xff0c;Jenkins Master 会在 kubernetes 中创建一个 Sla…

C语言 | Leetcode C语言题解之第556题下一个更大元素III

题目&#xff1a; 题解&#xff1a; int nextGreaterElement(int n){int x n, cnt 1;for (; x > 10 && x / 10 % 10 > x % 10; x / 10) {cnt;}x / 10;if (x 0) {return -1;}int targetDigit x % 10;int x2 n, cnt2 0;for (; x2 % 10 < targetDigit; x2…

MySQL数据库:SQL语言入门 【下】(学习笔记)

5&#xff0c;TCL —— 事务控制语言&#xff08;Transaction Control Language&#xff09; 用于数据库的事务管理。 &#xff08;1&#xff09;事务的概念作用 事务&#xff08;Transaction&#xff09;指的是一个操作序列&#xff0c;该操作序列中的多个操作要么都做&#…

TDesign了解及使用

文章目录 1、概述2、快速开始2.1使用 npm 安装2.2通过 浏览器引入 安装2.3、使用 3、简单案例3.1 路由创建3.2、 页面创建3.3、 Table组件3.4、序号展示3.5、 图片展示及预览3.6、 性别字段处理 1、概述 TDesign 是腾讯推出的设计系统&#xff0c;旨在提供一致的设计语言和视觉…

计算机网络(11)和流量控制补充

这一篇对数据链路层中的和流量控制进行详细学习 流量控制&#xff08;Flow Control&#xff09;是计算机网络中确保数据流平稳传输的技术&#xff0c;旨在防止数据发送方发送过多数据&#xff0c;导致接收方的缓冲区溢出&#xff0c;进而造成数据丢失或传输失败。流量控制通常…

Spark:不能创建Managed表,External表已存在...

Spark数仓建表 1、Spark on Hive与Hive on Spark2、Spark数仓建表相关问题 1、Spark on Hive与Hive on Spark 1.1、Hive on Spark Hive默认使用MapReduce作为执行引擎&#xff0c;即Hive on MapReduce。实际上&#xff0c;Hive还可以使用Tez或Spark作为其执行引擎&#xff0c;…

可扩展架构与分层架构

可扩展架构 1 概述 软件系统与硬件/建筑系统最大的区别就是可以迭代升级和扩展&#xff0c;一个硬件生产出来后就不会进行改变&#xff0c;除非拿去售后维修&#xff0c;一个建筑完工后也不会改变其整体的结构&#xff0c;除非被破坏后进行修复和重铸 可以发现如果硬件/建筑不…

vue el-date-picker 日期选择 回显后成功后无法改变的解决办法

在实现一个前端页面默认时间选择时遇到了手动选择日期无法回显但在浏览器vue插件监控属性时却能看到手动选择的值的问题。 <el-date-pickerv-else-if"item.type datetPicker"v-model"form[item.prop]":placeholder"item.placeholder":picke…

MyBatis从入门到进阶

目录 MyBatis入门1、创建项目、数据准备2、数据库配置3、编写持久层代码单元测试打印日志 基本操作查询数据插入数据删除数据更新数据 MyBatis - xml插入数据更新数据删除数据查询数据#{}与${}SQL注入排序like查询 MyBatis进阶if标签trim标签where标签set标签foreach标签sql标签…

skywalking各项指标说明

全局指标 all_p99&#xff1a;所有服务响应时间的第99百分位数&#xff08;p99&#xff09;&#xff0c;即99%的请求响应时间都小于这个值。all_p95&#xff1a;所有服务响应时间的第95百分位数&#xff08;p95&#xff09;&#xff0c;即95%的请求响应时间都小于这个值。all_…

docker save 和 docker load介绍

让我详细介绍 docker save 和 docker load 命令的使用&#xff1a; docker save 命令&#xff1a; 作用&#xff1a;将一个或多个 Docker 镜像保存为 tar 归档文件常用格式&#xff1a; # 基本语法 docker save [options] image [image...] > output.tar# 保存单个镜像 d…