Leetcode 剑指 Offer II 054. 把二叉搜索树转换为累加树

news2024/11/18 7:45:52

题目难度: 中等

原题链接

今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~

题目描述

给定一个二叉搜索树,请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。

提醒一下,二叉搜索树满足下列约束条件:

  • 节点的左子树仅包含键 小于 节点键的节点。
  • 节点的右子树仅包含键 大于 节点键的节点。
  • 左右子树也必须是二叉搜索树。

示例 1:

  • 输入:root = [4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
  • 输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]

示例 2:

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

示例 3:

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

示例 4:

  • 输入:root = [3,2,4,1]
  • 输出:[7,9,4,10]

提示:

  • 树中的节点数介于 0 和 10^4 之间。
  • 每个节点的值介于 -10^4 和 10^4 之间。
  • 树中的所有值 互不相同 。
  • 给定的树为二叉搜索树。

题目思考

  1. 如何利用二叉搜索树的性质?

解决方案

思路
  • 根据题目描述, 要将树的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和, 我们需要知道有哪些节点大于等于该节点
  • 结合二叉搜索树的性质, 其中序遍历的节点是从小到大有序的, 自然其逆向中序遍历的节点就是从大到小有序的
  • 我们可以利用这一点, 对树进行逆向中序遍历, 也就是先遍历右子树, 然后是当前节点, 最后是左子树
  • 同时维护一个后缀和, 遍历到某个节点时, 就将它的值累加到该后缀和里, 那么该后缀和就是树中大于或者等于当前节点值的所有节点值之和, 将当前节点的值更新为该后缀和即可
  • 最终遍历结束时, 树中所有节点的值就都更新好了, 直接返回根节点即可
  • 下面代码中有详细的注释, 方便大家理解
复杂度
  • 时间复杂度 O(N): 只需要遍历每个节点一次
  • 空间复杂度 O(H): 递归调用最多使用 O(H) 栈空间, H 是树的高度
代码
class Solution:
    def convertBST(self, root: TreeNode) -> TreeNode:
        # 逆向中序遍历+后缀和
        # sm是当前遍历过的所有节点的后缀和
        sm = 0

        def revInorder(root):
            nonlocal sm
            if not root:
                return
            # 逆向中序遍历, 先遍历右子节点
            revInorder(root.right)
            # 后缀和加上当前节点值, 因为题目要求的是大于等于
            sm += root.val
            # 将当前节点值更新为后缀和
            root.val = sm
            revInorder(root.left)

        revInorder(root)
        return root

大家可以在下面这些地方找到我~😊

我的 GitHub

我的 Leetcode

我的 CSDN

我的知乎专栏

我的头条号

我的牛客网博客

我的公众号: 算法精选, 欢迎大家扫码关注~😊

算法精选 - 微信扫一扫关注我

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

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

相关文章

visual studio 下的git

我这个是看视频笔记 YouTube : https://www.youtube.com/watch?vgkDASVE_Hdg 主要内容是:建立git 库, 保存commit, 建立分支 create branch, 合并分支merge branch,比较 diff,Revert ,history,delete branch, rename branch, t…

详解STUN与TR111

STUN协议定义了三类测试过程来检测NAT类型: Test1:STUN Client通过端口{IP-C1:Port-C1}向STUN Server{IP-S1:Port-S1}发送一个Binding Request(没有设置任何属性)。STUN Server收到该请求后,通过端口{IP-S1:Port-S1}把…

网站定制开发主要分类有哪些|企业 app 软件小程序定制

网站定制开发主要分类有哪些|企业 app 软件小程序定制 网站定制开发是指根据客户需求,为其量身定制设计和开发的网站服务。目前,网站定制开发主要分为以下几个分类: 1.静态网站定制开发:静态网站是由 HTML、CSS 和 JavaScript 等静…

golang defer关键词执行原理与代码分析

使用的go版本为 go1.21.2 首先我们写一个简单的defer调度代码 package mainimport "fmt"func main() {defer func() {fmt.Println("xiaochuan")}() }通过go build -gcflags -S main.go获取到对应的汇编代码 可以在图中看到有个CALL runtime.deferreturn(…

深度解读英伟达新一轮对华特供芯片H20、L20、L2的定位

大家好,我是极智视界,欢迎关注我的公众号,获取我的更多前沿科技分享 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码和资源下载,链接:https://t.zsxq.com/0aiNxERDq 因为一直从事 AI 工…

统计二叉树中的伪回文路径 : 用位运用来加速??

题目描述 这是 LeetCode 上的 「1457. 二叉树中的伪回文路径」 ,难度为 「中等」。 Tag : 「DFS」、「位运算」 给你一棵二叉树,每个节点的值为 1 到 9 。 我们称二叉树中的一条路径是 「伪回文」的,当它满足:路径经过的所有节点值…

python之pyqt专栏3-QT Designer

从前面两篇文章python之pyqt专栏1-环境搭建与python之pyqt专栏2-项目文件解析,我们对QT Designer有基础的认识。 QT Designer用来创建UI界面,保存的文件是"xxx.ui"文件,"xxx.ui"可以被pyuic转换为"xxx.py",而&…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于Fisher时段划分的配电网源网荷储多时间尺度协调优化调控策略》

这个标题涉及到电力系统领域的一些关键概念和方法。让我们逐步解读: 基于Fisher时段划分: "基于"表示这个策略或方法的核心基础是某个特定的理论或技术。"Fisher时段划分"可能指的是使用Fisher信息矩阵进行时间划分。Fisher信息矩阵…

php的字符转义函数有那些,是干什么的

在 PHP 中,字符转义函数是用于处理字符串中的特殊字符,以防止这些字符被误解、滥用或引起安全问题的一组函数。这些函数的主要作用是确保在将用户提供的数据插入到数据库、构建 HTML 输出或进行其他与安全相关的操作时,不会导致潜在的安全漏洞…

基于Python 中创建 Sentinel-2 RGB 合成图像

一、前言 下面的python代码将带您了解如何从原始 Sentinel-2 图像创建 RGB 合成图像的过程。 免费注册后,可以从 Open Access Hub 下载原始图像。 请注意,激活您的帐户可能需要 24 小时! 二、准备工作 (1)导入必要的库…

内测分发平台如何保护用户隐私?

大家好,我是咕噜-凯撒,在软件开发的早期阶段,内测是一个至关重要的步骤。通过内测,开发者可以在产品正式上市前发现并修复bug,获取用户反馈优化用户体验。但是内测过程中往往会处理大量用户的敏感信息,尤其…

数字人直播系统开发要注意的陷阱

数字人做为元宇宙的底层基座,BAT都在跑步进场,目前具有前瞻性的公司都在布局数字人产业。数字人可以应用于很多业务场景,对今年来说,无疑数字人直播系统是最火的。像去年数字人直播SAAS系统定制开发的话没有个百把万是下不来的。但…

激光塑料透光率检测仪进行材料质量监控

焊接质量检测是对焊接成果的检测,目的是保证焊接结构的完整性、可靠性、安全性和使用性。焊接质量检测通常包括外观检验、内部检查、无损检测以及试件制作与送检等步骤。通过这些检测方法,可以全面评估焊接质量,确保其符合设计要求和规范标准…

2023年亚太杯数学建模A题水果采摘机器人的图像识别功能(基于yolov5的苹果分割)

注:.题中附录并没有给出苹果的标签集,所以需要我们自己通过前4问得到训练的标签集,采用的是yolov5 7.0 版本,该版本带分割功能 一:关于数据集的制作: clc; close all; clear; %-----这个是生成yolov5 数据…

React UI界面:Ant Design初步

文章目录 初步回调函数变量输出 React初步 初步 Antd是一套非常现代的React组件库,是好多人用过的第一个组件库,但我对其印象最深的却是圣诞节彩蛋,只是上网一查才发现,一晃这么多年过去了。 先创建一个React项目,然…

个人硬件测试用例入门设计

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 🌤️功能测试 进行新增、…

【开源】基于微信小程序的智慧家政系统

项目编号: S 063 ,文末获取源码。 \color{red}{项目编号:S063,文末获取源码。} 项目编号:S063,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询家政服…

【opencv】计算机视觉:实时目标追踪

目录 前言 解析 深入探究 前言 目标追踪技术对于民生、社会的发展以及国家军事能力的壮大都具有重要的意义。它不仅仅可以应用到体育赛事当中目标的捕捉,还可以应用到交通上,比如实时监测车辆是否超速等!对于国家的军事也具有一定的意义&a…

管理类联考——数学——汇总篇——知识点突破——代数——函数——记忆

文章目录 整体文字提炼图像绘画 考点记忆/考点汇总——按大纲 本篇思路:根据各方的资料,比如名师的资料,按大纲或者其他方式,收集/汇总考点,即需记忆点,在通过整体的记忆法,比如整体信息很多&am…

taro h5 ios解决input不能自动获取焦点拉起键盘

描述:页面中有个按钮,点击跳转到第二个页面(有input),能直接获取焦点拉起键盘输入 安卓: 直接用focus() ios: focus无效,必须手动拉起 原理: 点击按钮的时候拉起一…