【每日一题】从二叉搜索树到更大和树

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:中序遍历的反序
    • 方法二:后缀数组
  • 写在最后

Tag

【中序遍历】【二叉树】【2023-12-04】


题目来源

1038. 从二叉搜索树到更大和树


题目解读

在二叉搜索树中,将每一个节点的值替换成树中大于等于该节点值的所有节点值之和。


解题思路

方法一:中序遍历的反序

前言

给的是一棵二叉搜索树(英文名称为 Binary Search Tree,以下简称为 BST),我们要充分利用 BST 的性质来解题。BST 的约束条件为:

  • 节点的左子树的节点值都小于该节点的值;
  • 节点的右子树的节点值都大于该节点的值;
  • 左右子树也都是 BST。

根据 BST 的约束条件可以得到一条重要的性质:如果对 BST 进行中序遍历,那么将会得到 BST 中节点值升序的一个序列。

思路

我们以示例 1 为例来说明我们是如何利用 BST 的性质来解决本题的。

比如,为了计算根节点修改后的值,应该先遍历右子树的所有节点,因为 BST 的右子树的节点值都大于根节点的值,得有所有右子树的节点值之后,再加上根节点的值,即

8 + 7 + 6 + 5 + 4 = 30 8+7+6+5+4=30 8+7+6+5+4=30

这便是根节点修改后的值。我们在计算某个节点(后文称之为 “计算节点”)的大于等于该节点的所有节点之和是利用递归来实现的。

“递”:一直 “递” 到叶子节点,也就是到达了递归边界。

“归”:在归的过程中自底向上的将叶子节点到 “计算节点” 这一路上的所有节点值都修改了,修改为递归上来的 s(当前节点的右子树的所有节点之和)加上当前节点的值。

在更新了 “计算节点” 的值之后,递归修改 “计算节点” 的左子树。

算法

初始化全局变量 s = 0,从根节点开始递归修改,递归函数为:

  • 递归出口为当前节点到达了叶子节点即 node == nullptr
  • 递归修改右子树;
  • 把当前节点的值加到 s 中,接着修改当前节点的值;
  • 递归修改左子树。
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
private: int s = 0;void dfs(TreeNode* node) {if (node == nullptr) {return;}dfs(node->right);s += node->val;node->val = s;dfs(node->left);}public:TreeNode* bstToGst(TreeNode* root) {dfs(root);return root;}
};

复杂度分析

时间复杂度: O ( n ) O(n) O(n) n n n 为 BST 的节点个数。

空间复杂度: O ( n ) O(n) O(n),最坏情况下,BST 退化成一条链,此时递归需要的栈空间为 O ( n ) O(n) O(n)

方法二:后缀数组

熟悉 “如果对 BST 进行中序遍历,那么将会得到 BST 中节点值升序的一个序列” 这条性质的读者还可以有另一种解题思路。

首先将 BST 按中序遍历的顺序输出到数组中,得到升序数组 nums。数组中的数加上其后的所有数之和就是 BST 中的 “大于等于该节点值的所有节点值之和”。

于是需要维护一个后缀数组,最后将更新好的后缀数组中的值还原到二叉搜索树上。

该方法实现起来有些繁琐,感兴趣的读者可以自行实现。


写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

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

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

相关文章

根文件系统lib库添加与初步测试

一. 简介 我们在编译 busybox源码时,选择的是动态编译,所以,制作生成的 根文件系统中/bin或 /sbin目录下软件运行时会调用到一些库文件的。库文件就是交叉编译器的库文件。 前面我们编译 busybox源码时,选择动态编译&#xff0…

NPS内网穿透教程

1.简介 nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还支持内网ht…

安卓1.0明显是基于linux内核开发的,安卓1.0是不是linux套壳?

安卓1.0明显是基于linux内核开发的,安卓1.0是不是linux套壳? 在开始前我有一些资料,是我根据自己从业十年经验,熬夜搞了几个通宵,精心整理了一份「安卓开发资料从专业入门到高级教程工具包」,点个关注&…

大数据集群增加数据盘,平衡数据盘HDFS Disk Balancer

大数据集群增加数据盘,平衡数据盘HDFS Disk Balancer 官网:https://hadoop.apache.org/docs/r3.3.6/hadoop-project-dist/hadoop-hdfs/HDFSDiskbalancer.html hdfs diskbalancer -execute /system/diskbalancer/nodename.plan.jsonhdfs diskbalancer -q…

IDEA2023找不到 Allow parallel run

我的idea版本:2023.1.4 第一步:点击Edit Configrations 第二步:点击Modify options 第三步:勾选Allow multiple instances 最后点击Apply应用一下 ok,问题解决!

SSM项目实战-登录验证成功并路由到首页面,Vue3+Vite+Axios+Element-Plus技术

1、util/request.js import axios from "axios";let request axios.create({baseURL: "http://localhost:8080",timeout: 50000 });export default request 2、api/sysUser.js import request from "../util/request.js";export const login (…

Mysql日志

文章目录 1. 日志类型2. bin log2.1 写入机制2.2 binlog与redolog对比2.3 两阶段提交 3. 中继日志 1. 日志类型 这 6 类日志分别为: 慢查询日志: 记录所有执行时间超过long_query_time的所有查询,方便我们对查询进行优化。 通用查询日志&am…

在sCrypt网站上铭刻Ordinals

sCrypt发布了一个新的Ordinals铭刻工具,连接Panda Wallet后即可使用。你可以观看我们录制的视频教程,获得更多细节。 铭刻工具同时支持BSV主网(mainnet)和测试网(testnet),你可以在我们的官方网…

手写VUE后台管理系统8 - 配置404NotFound路由

设置404页面 配置路由404页面 配置路由 这里配置了两个路由,一个是主页,另外一个则匹配任意路由显示为404页面。因为只配置了两个路由,如果路径没有匹配到主页,则会被自动导向到404页面,这样就可以实现整站统一的404页…

「Linux」使用C语言制作简易Shell

💻文章目录 📄前言简易shell实现shell的概念系统环境变量shell的结构定义内建命令完整代码 📓总结 📄前言 对于很多学习后端的同学来讲,学习了C语言,发现除了能写出那个经典的“hello world”以外&#xff…

142873-41-4脂质过氧化抑制剂1-星戈瑞

142873-41-4脂质过氧化抑制剂1 英文名称:Lipid peroxidation inhibitor 1 中文名称:脂质过氧化抑制剂 化学名称:2,4,6,7-四甲基-2-[(4-苯基哌啶-1-基)甲基]-3H-1-苯并呋喃-5-胺 CAS:142873-41-4 外观:固体粉末 分…

D2822ML 用于便携式录音机和收音机作音频功率放大器。采用 DIP8 SOP8 封装形式

D2822ML 用于便携式录音机和收音机作音频功率放大器。采用 DIP8 SOP8 封装形式 特点: 电源电压降到 1.8V 时仍能正常工作交越失真小 静态电流小可作桥式或立体声式功放应用外围元件少通道分离度高 开机和关机无冲击噪声软限幅

RT-Thread 内存管理

在计算机系统中,通常存储空间可以分为两种:内部存储空间和外部存储空间。 内部存储空间通常访问速度比较快,能够按照变量地址随机访问,也就是我们通常所说的RAM(随机存储器),可以把它理解为电脑…

微信公众号端在线客服系统源码 聊天记录云端实时保存 附带完整的搭建教程

随着社交媒体的普及,越来越多的用户通过微信公众号与企业进行沟通。因此,开发一款基于微信公众号的在线客服系统,可以帮助企业更好地服务用户,提高客户满意度。同时,为了解决聊天记录的存储和管理问题,我们…

如何看待华为宣称“纯鸿蒙”OS将不再兼容安卓应用 APK彻底再见?

如何看待华为宣称“纯鸿蒙”OS将不再兼容安卓应用 APK彻底再见? 在开始前我有一些资料,是我根据自己从业十年经验,熬夜搞了几个通宵,精心整理了一份「安卓开发资料从专业入门到高级教程工具包」,点个关注,…

2023.12.4 GIT的概念和组成

目录 1.git的介绍 2.git的历史 开发者:Linus Torvalds Linux的创始人 3.git和svn的对比 svn:集中式管理 git:分布式管理 4.git管理的组成结构 1.git的介绍 git是项目版本管理工具,能自动的将多个版本进行管理存储,类似于快照,多个人共享版本 git的诞生:分布式…

行为型剩余的模式

1.中介者模式 package com.jmj.pattern.mediator;public abstract class Mediator {public abstract void constact(String message,Person person); }package com.jmj.pattern.mediator;public class MediatorStructure extends Mediator{private HouseOwner houseOwner;priva…

华为云云绘本第一期:童话奇迹原来是你

点此进入官网,专家1对1:应用身份管理服务OneAccess_华为云IDaaS-华为云

赛捷CRM集成无需API开发:连接营销系统,优化电商用户运营和广告策略

赛捷CRM集成无需API开发:连接营销系统,优化电商用户运营和广告策略 在当前的电商热潮下,企业如何在竞争中脱颖而出,提高用户运营效率和广告策略的精准度,成为了关键性的挑战。赛捷CRM以其无需API开发的集成解决方案&a…

如何看待 Android 面试却是 Java 面试官?

如何看待 Android 面试却是 Java 面试官? 在开始前我有一些资料,是我根据自己从业十年经验,熬夜搞了几个通宵,精心整理了一份「Android资料从专业入门到高级教程工具包」,点个关注,全部无偿共享给大家&…