【1026. 节点与其祖先之间的最大差值】

news2024/11/28 3:29:09

来源:力扣(LeetCode)

描述:

给定二叉树的根节点 root,找出存在于 不同 节点 AB 之间的最大值 V,其中 V = |A.val - B.val|,且 AB 的祖先。

(如果 A 的任何子节点之一为 B,或者 A 的任何子节点是 B 的祖先,那么我们认为 A 是 B 的祖先)

示例 1:

1

输入:root = [8,3,10,1,6,null,14,null,null,4,7,13]
输出:7
解释: 
我们有大量的节点与其祖先的差值,其中一些如下:
|8 - 3| = 5
|3 - 7| = 4
|8 - 1| = 7
|10 - 13| = 3
在所有可能的差值中,最大值 7|8 - 1| = 7 得出。

示例 2:

2

输入:root = [1,null,2,null,0,3]
输出:3

提示:

  • 树中的节点数在 2 到 5000 之间。
  • 0 <= Node.val <= 105

方法:深度优先搜索

题目要求找出所有祖先节点与它的子孙节点的绝对差值的最大值。按照枚举的思路,我们可以枚举子孙节点,然后找出它的所有祖先节点,计算绝对差值。同样地,我们也可以枚举祖先节点,然后找出它的所有子孙节点,计算绝对差值。

以第一种思路为例,并非所有祖先节点都需要被考虑到,我们只需要获取最小的祖先节点以及最大的祖先节点。我们对二叉树执行深度优先搜索,并且记录搜索路径上的节点的最小值 mi 与最大值 ma。假设当前搜索的节点值为 val,那么与该子孙节点与它的所有祖先节点的绝对差值最大值为 max(∣val − mi∣, ∣val − ma∣),搜索该节点的左子树与右子树时,对应的 mi = min(mi, val),ma = max(ma, val)。

  • 为什么只需要获取最小的祖先节点以及最大的祖先节点?

假设某一子孙节点为 x,对应的最小的祖先节点为 mi,最大的祖先节点为 ma。有任一祖先节点为 y,显然 mi ≤ y ≤ ma。如果 x ≤ y,那么 ∣x − y∣ = y − x ≤ ma − x = ∣x − ma∣,如果 x > y,那么 ∣x − y∣= x − y ≤ x − mi =∣x − mi∣,因此最大的绝对差值与祖先节点 y 无关。

第二种思路是否可行?

可行,需要返回当前子树的最小值和最大值,方法类似。

代码:

class Solution {
public:
    int dfs(TreeNode *root, int mi, int ma) {
        if (root == nullptr) {
            return 0;
        }
        int diff = max(abs(root->val - mi), abs(root->val - ma));
        mi = min(mi, root->val);
        ma = max(ma, root->val);
        diff = max(diff, dfs(root->left, mi, ma));
        diff = max(diff, dfs(root->right, mi, ma));
        return diff;
    }

    int maxAncestorDiff(TreeNode* root) {
        return dfs(root, root->val, root->val);
    }
};

执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:10.4 MB, 在所有 C++ 提交中击败了34.05%的用户
复杂度分析
时间复杂度:O(n),其中 n 是二叉树的节点数目。遍历二叉树的所有节点需要 O(n)。
空间复杂度:O(n)。最坏情况下,二叉树退化为链表,递归栈的空间为 O(n)。
author:LeetCode-Solution

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

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

相关文章

大小端字节序存储

每个数据类型在内存中都会被分配若干个字节&#xff0c;而这些字节在内存中的存储顺序就是字节序。在计算机底层存储中&#xff0c;有两种常见的字节序&#xff1a;大端字节序和小端字节序。 大端字节序&#xff1a;高位字节在前&#xff0c;低位字节在后&#xff1b;小端字节…

藏经阁(七)有源蜂鸣器和无源蜂鸣器 解析

文章目录特征区别场景选型实战应用特征 有源蜂鸣器特征&#xff1a; 又被称为直流蜂鸣器包含了一个多谐振荡器只要额定直流电压可以在两端发出声音具有驱动控制简单价格略高 无源蜂鸣器特征&#xff1a; 又被称为交流蜂鸣器内部没有振荡器需要在两端施加特定频率的方波电压…

如何借助无线通讯终端实现组态王与PLC之间通信?

本方案是基于Modbus RTU协议下实现的1主多从自组网无线通信形式&#xff0c;主站为组态王&#xff0c;从站为两台三菱FX5U PLC。在工厂里&#xff0c;组态王和plc所处位置距离较为分散&#xff0c;重新铺设电缆线工期长&#xff0c;成本高&#xff0c;故采用日系PLC专用无线通讯…

LDMUI-001 61320946C模拟量模件的40端即直流24伏的负端接至逻辑地汇流排上

LDMUI-001 61320946C模拟量模件的40端即直流24伏的负端接至逻辑地汇流排上 ​ 八、现场接地常用注意事项 1.现场控制站 接地螺丝因机柜本体与底座间有胶皮形成绝缘&#xff0c;屏蔽地汇流排与底座间绝缘&#xff0c;现场控制站必须按规定做好接地处理。即分别接至现场控制站接…

tmall.item.sizemapping.template.update( 更新天猫商品尺码表模板 )

&#xffe5;开放平台免费API必须用户授权 更新天猫商品尺码表模板 公共参数 请求地址: 公共请求参数: 公共响应参数: ![在这里插入图片描述](https://img-blog.csdnimg.cn/d28890c8804c4a50bdd0877f0d2a9659.png请求参数 响应参数 点击获取key和secret 请求示例 响应示例 异…

PHP的垃圾回收机制(全网详解)

概念&#xff1a; PHP的垃圾回收机制是自动的&#xff0c;它通过内置的垃圾回收器(Garbage Collector)来实现。当一个PHP对象不再被引用时&#xff0c;它就成为垃圾。垃圾回收器会定期扫描内存中的所有对象&#xff0c;将没有引用的对象标记为垃圾&#xff0c;并释放它们占用的…

MDK编译过程及文件类型

编译过程 .c和.s文件通过armcc编译器转为.o 其中的code、RO、RW、ZI-data 程序运行时rom中的rw-data复制到SRAM中&#xff0c;SRAM中一般存储可读写的变量&#xff0c;所以ZI-data和RW-data的数据存储在这 经典问题 C语言的全局变量存放在哪里? C语言的全局变量存放在…

HTB-Magic

HTB-Magic信息收集80端口立足www-data -> theseustheseus -> root信息收集 80端口 主页如下。 左下角有一个Login。 抓包后尝试sql注入。 上传一个图片并保存请求。 上传的文件会在/uploads/上传文件名后缀。 只允许我们上传jpg&#xff0c;jpeg&#xff0c;png文…

C/C++每日一练(20230418)

目录 1. 搜索插入位置 &#x1f31f; 2. 最长有效括号 &#x1f31f;&#x1f31f;&#x1f31f; 3. 子集 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏…

2023软件测试银四如何逆势涨薪,开头30秒给你想要的答案

引言 2023软件测试银四逆势涨薪&#xff0c;这是一个让人兴奋的话题。毕竟&#xff0c;在当前就业市场的背景下&#xff0c;很多人正在面临着困境&#xff0c;而能够在逆势中实现薪资上涨的机会&#xff0c;显然是非常值得我们去关注的。 那么&#xff0c;到底是什么让这些软…

C语言实现惯导更新算法(机械编排)

四元数 四元数可用于描述刚体转动或姿态变换,与方向余弦阵相比,表达简洁。四元数是一个包含四个元素的列向量,列向量的第一个元素表示刚体围绕旋转轴转过的角度大小,其余3个元素代表了旋转轴的方向。 姿态更新算法 本程序姿态的递推计算采用四元数来实现,姿态的变化采…

coinex02// 撮合引擎 RingBuffer Disruptor的构建与使用

目录 0. 课程视频地址 0.1 撮合引擎课程 0.1 RocketMQ安装 0.3 RocketMQ搭建成功后登录 1. docker 配置rocketmq 2 逻辑树 : 构建RingBuffer -> 使用RingBuffer 2.1 生产者往RingBuffer中放数据 Disruptor把数据推给消费者cpu 2.2 RingBuffer, Disruptor的创建 ->…

麻了,别再为难测试工程师了...

前言 有不少技术友在测试群里讨论&#xff0c;近期的面试越来越难了&#xff0c;要背的八股文越来越多了,考察得越来越细&#xff0c;越来越底层&#xff0c;明摆着就是想让我们徒手造航母嘛&#xff01;实在是太为难我们这些测试工程师了。 这不&#xff0c;为了帮大家节约时…

Stable Diffusion XL:更快,更强

Stable Diffusion XL&#xff1a;更快&#xff0c;更强 今天&#xff0c;Stability AI 的创始人兼首席执行官 Emad Mostaque 发推宣布&#xff0c;Stable Diffusion XL 进入公测阶段。 核心信息总结起来有2点&#xff1a; “XL”不是新模型的官方名称&#xff0c;Stability …

计算机图形学——游戏方向 第一章 计算机图形学概述

计算机图形学——游戏方向 第一章 计算机图形学概述前言第一章 计算机图形学概述1.为什么设计专业要学习计算机图形学?计算机图形学与计算机视觉等领域的关系计算机图形学基础自学体系2.计算机图形学的辨析3.计算机图形&#xff08;学&#xff09;的发展历史1951&#xff1a;N…

〖Python网络爬虫实战⑭〗- BeautifulSoup详讲

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;目前专栏免费订阅&#xff0c;在转为付费专栏前订阅本专栏的&#xff0c;可以免费订阅付费…

Flume系列:Flume Source使用

目录 Apache Hadoop生态-目录汇总-持续更新 1&#xff1a;taildir source 2&#xff1a;kafka source 3&#xff1a;exec source&#xff08;tail -F&#xff09; 4&#xff1a;netcat source&#xff08;采集端口&#xff09; 5&#xff1a;spoolDir读取目录文件&#xf…

Axios请求(对ajax的二次封装)——Axios API、Axios实例、请求配置、Axios响应结构

axios起步——介绍和使用基本用例post请求场景复现核心干货axios APIaxios(config)axios(url[,config])请求方式别名axios实例创建一个axios实例axios.create([config])实例方法axios请求配置axios响应结构场景复现 最近学习与前端相关的小程序时&#xff0c;接触了异步请求ap…

医学图像配准 (Medical Image Registration)

目录 Classification Transformation Registration Algorithms Landmark Based Surfaced Based Voxel Intensity Based Information Theory Based Registration using basis functions Registration using splines Other Physics Based Registration Optimization V…

OctoClock CDA 2990

CDA 2990 CDA 2990为时钟和PPS分发设备&#xff0c;支持外部一路时钟和PPS输入&#xff0c;最高支持8路时钟和PPS输出。同时CDA 2990可选配带GPS模块版本&#xff0c;可外接GPS天线&#xff0c;支持通过GPS锁定时钟和PPS信号输出。CDA 2990主要用于多台USRP设备进行同步。 CDA…