leetCode 1026. 节点与其祖先之间的最大差值 + 递归

1026. 节点与其祖先之间的最大差值 - 力扣(LeetCode)


给定二叉树的根节点 root,找出存在于 不同 节点 A 和 B 之间的最大值 V,其中 V = |A.val - B.val|,且 A 是 B 的祖先。(如果 A 的任何子节点之一为 B,或者 A 的任何子节点是 B 的祖先,那么我们认为 A 是 B 的祖先)


示例 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:

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

方法一:「递」

V=∣A.val−B.val∣,要是V尽可能的大,分类讨论:

      ① 如果 A.val < B.val ,那么 A.val 越小,V 越大

      ② 如果 A.val >= B.val ,那么 A.val 越大,V 越大

故,无需记录递归路径中的全部节点值,只需记录递归路径中的最小值 minV最大值 maxV

        - minV = min(minV,B.val);

        - maxV = max(maxV,B.val);

每递归到一次节点B,计算: max(∣minV−B.val∣,∣maxV−B.val∣)

由于 minV <= B.val <= maxV ,上式可化简为:max(B.val−minV,maxV−B.val)

更新答案的最大值ans = max(ans,max(B.val - minV,maxV - B.val));

// 方法一:自顶向下
class Solution {
public:int ans = 0;void dfs(TreeNode* node,int minV,int maxV) {if(node == nullptr) return;minV = min(minV,node->val);maxV = max(maxV,node->val);ans = max(ans,max(node->val - minV,maxV - node->val));dfs(node->left,minV,maxV);dfs(node->right,minV,maxV);}int maxAncestorDiff(TreeNode* root) {dfs(root, root->val, root->val);return ans;}
};

优化:对于一条从根出发向下的路径,实际上算的是这条路径上任意两点的最大差值

递归到叶子时,minV maxV是从根到叶子的路径上的最小值和最大值,那么从根到叶子的路径上任意两点最大差值maxV - minV 。所以无需每个节点都去更新答案,在递归到终点时才去更新答案

// 方法一:自顶向下
class Solution {
public:int ans = 0;void dfs(TreeNode* node,int minV,int maxV) {if(node == nullptr) {ans = max(ans,maxV-minV);return;}minV = min(minV,node->val);maxV = max(maxV,node->val);dfs(node->left,minV,maxV);dfs(node->right,minV,maxV);}int maxAncestorDiff(TreeNode* root) {dfs(root, root->val, root->val);return ans;}
};

方法二:「归」

int minV=node->val,maxV=minV;
minV = min(minV,min(minLV,minRV));
maxV = max(maxV,max(maxLV,maxRV));
ans = max(ans,max(node->val - minV,maxV - node->val));
// 自底向上
class Solution {
public:int ans = 0;pair<int,int> dfs(TreeNode* node) {if(node == nullptr) return {INT_MAX, INT_MIN};int minV=node->val,maxV=minV;auto [minLV,maxLV] = dfs(node->left);                                  auto [minRV,maxRV] = dfs(node->right);minV = min(minV,min(minLV,minRV));maxV = max(maxV,max(maxLV,maxRV));ans = max(ans,max(node->val - minV,maxV - node->val));return {minV,maxV};}int maxAncestorDiff(TreeNode* root) {dfs(root);return ans;}
};

参考和推荐文章:

1026. 节点与其祖先之间的最大差值 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/maximum-difference-between-node-and-ancestor/solutions/2232367/liang-chong-fang-fa-zi-ding-xiang-xia-zi-wj9v/

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

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

相关文章

网络和Linux网络_5(应用层)HTTP协议(方法+报头+状态码)

目录 1. HTTP协议介绍 1.1 URL介绍 1.2 urlencode和urldecode 1.3 HTTP协议格式 1.4 HTTP的方法和报头和状态码 2. 代码验证HTTP协议格式 HttpServer.hpp 2.2 html正式测试 Util.hpp index.html 2.3 再看HTTP方法和报头和状态码 2.3.1 方法_GET和POST等 2.3.2 报头…

SpringBoot——国际化

优质博文&#xff1a;IT-BLOG-CN 一、Spring 编写国际化时的步骤 【1】编写国际化配置文件&#xff1b; 【2】使用ResourceBundleMessageSource管理国际化资源文件&#xff1b; 【3】在页面使用ftp:message取出国际化内容&#xff1b; 二、SpringBoot编写国际化步骤 【1】创…

软件工程期末复习(选择+填空+判断)

文章目录 软件工程期末复习一、 选择题 软件工程期末复习 一、 选择题 1.“软件危机”的表现不包括&#xff1a;&#xff08;c&#xff09; A、软件产品不能按期交付 B、用户对“已完成的”软件产品时常不满意 C、程序员越来越供不应求 D、软件项目难以管理&#xff0c;维护困…

东胜物流软件 SQL注入漏洞复现

0x01 产品简介 东胜物流软件是一款致力于为客户提供IT支撑的 SOP&#xff0c; 帮助客户大幅提高工作效率&#xff0c;降低各个环节潜在风险的物流软件。 0x02 漏洞概述 东胜物流软件 TCodeVoynoAdapter.aspx、/TruckMng/MsWlDriver/GetDataList、/MvcShipping/MsBaseInfo/Sav…

CSS3制作3D爱心动画

1、什么是CSS css&#xff0c;即层叠样式表的简称&#xff0c;是一种标记语言&#xff0c;有浏览器解释执行用来使页面变得更美观。 2、选择器 css3中新增了一些选择器&#xff0c;如下&#xff1a; 3、新样式 边框 css3新增了三个边框属性&#xff0c;分别是&#xff1a; bo…

linux之下安装 nacos

1 下载地址 也可使用在线下载wget https://github.com/alibaba/nacos/releases/download/1.4.6/nacos-server-1.4.6.tar.gzTags alibaba/nacos GitHuban easy-to-use dynamic service discovery, configuration and service management platform for building cloud nativ…

android trace文件的抓取与查看方法

本地手机抓取trace 解压android trace文件的抓取与查看方法 找到config.pbtx文件&#xff0c;连接手机push进去 # push config.pbtx &#xff0c;/data/local/tmp/为自定义push到的目录 adb push config.pbtx /data/local/tmp/ adb shell # 抓取trace&#xff0c; /data/loc…

【MyBatisPlus】通俗易懂 快速入门 详细教程

目录 学习目标 一、MyBatisPlus简介 1. 入门案例 问题导入 1.1 SpringBoot整合MyBatisPlus入门程序 ①&#xff1a;创建新模块&#xff0c;选择Spring初始化&#xff0c;并配置模块相关基础信息 ②&#xff1a;选择当前模块需要使用的技术集&#xff08;仅保留JDBC&…

bodymovin:AE动画导出为JSONforMac/win中文版下载

对于动画制作爱好者和专业设计师来说&#xff0c;Adobe After Effects&#xff08;AE&#xff09;是一个强大的工具&#xff0c;可以创造出惊人的动画效果。然而&#xff0c;将这些动画导出为可交互的格式一直是一个挑战。现在&#xff0c;有了bodymovin&#xff0c;你可以轻松…

[原创][1]探究C#多线程开发细节-“Thread类的简单使用“

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XXQQ: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi…

搜索百度可以直接生成代码拉

先看效果图&#xff1a; 使用示例&#xff1a; 比如我要搜索“JS取一个数在两个数更近”的方法&#xff0c;直接搜“JS取一个数在两个数更近”&#xff0c;点击百度一下&#xff0c;就会出现想要的代码&#xff0c;如上图。

基于OpenCV+YOLOv5实现车辆跟踪与计数(附源码)

导 读 本文主要介绍基于OpenCVYOLOv5实现车辆跟踪与计数的应用&#xff0c;并给出源码。 资源下载 基础代码和视频下载地址&#xff1a; https://github.com/freedomwebtech/win11vehiclecount main.py代码:​​​​​​​ import cv2import torchimport numpy as npfrom tr…

Kotlin学习之集合

原文链接 Kotlin Collections 现代的软件一般比较复杂&#xff0c;程序语言中的基本数据类型往往不能满足需要&#xff0c;除了基本的数据类型以外&#xff0c;还有对象的容器也非常的重要&#xff0c;比如线性容器&#xff08;数组&#xff0c;列表和Set&#xff09;和二维容…

C语言:输出所有“水仙花数”。“水仙花数”是指一个3位数,其各位数字的立方和等于该数本身,如153=1^3 +5^3+3^3

分析&#xff1a; 在主函数 main 中&#xff0c;程序首先定义四个整型变量 m、a、b 和 c&#xff0c;并用于计算和判断水仙花数。然后使用 printf 函数输出提示信息。 接下来&#xff0c;程序使用 for 循环结构&#xff0c;从 100 到 999 遍历所有三位数。对于每个遍历到的数 m…

Mac电脑数据库管理 Navicat Premium 15中文 for mac

Navicat Premium 15是一款强大的数据库管理和开发工具。它支持多种数据库类型&#xff0c;包括MySQL、MariaDB、Oracle、PostgreSQL等&#xff0c;可以帮助用户方便地管理和维护数据库。该软件提供了直观的用户界面和强大的功能&#xff0c;可以帮助用户快速创建、编辑和删除数…

ubuntu/vscode下的c/c++开发之-CMake语法与练习

Cmake学习 1 语法特性介绍 基本语法格式&#xff1a;指令(参数 1 参数 2...) 参数使用括弧括起参数之间使用空格或分号分开 指令是大小写无关的&#xff0c;参数和变量是大小写相关的 set(HELLO hello.cpp) add_executable(hello main.cpp hello.cpp) ADD_EXECUTABLE(hello ma…

2023大模型安全解决方案白皮书

今天分享的是大模型系列深度研究报告&#xff1a;《2023大模型安全解决方案白皮书》。 &#xff08;报告出品方&#xff1a;百度安全&#xff09; 报告共计&#xff1a;60页 前言 在当今迅速发展的数字化时代&#xff0c;人工智能技术正引领着科技创新的浪潮而其中的大模型…

C语言:写一个函数,实现3*3矩阵的转置(指针)

分析&#xff1a; 在主函数 main 中&#xff0c;定义一个 3x3 的整型数组 a&#xff0c;并定义一个指向整型数组的指针 p。然后通过循环结构和 scanf 函数&#xff0c;从标准输入中读取用户输入的 3x3 矩阵的值&#xff0c;并存储到数组 a 中。 接下来&#xff0c;调用 mov…

Docker 的诅咒:曾以为它是终极解法,最后却是“罪大恶极”?

系统管理中的基础问题 打包软件一直是系统管理中的一大基础问题。它非常重要&#xff0c;对系统的使用方式有着巨大影响&#xff0c;甚至让包管理器成为区分操作系统的一项重要指标。 以 Windows 为例&#xff1a;在很多“Linux 派”眼中&#xff0c;这款操作系统最不讨喜的就…

docker 安装oracle 11,配置客户端远程连接

最近由于工作需要&#xff0c;oracle11数据库的导入导出&#xff0c;所以自己在电脑上模拟个数据库环境&#xff0c; 1.docker的安装&#xff0c;可以参考之前文档&#xff0c;也可以直接yum install 包名字安装 2.下载镜像 docker pull registry.cn-hangzhou.aliyuncs…