538. 把二叉搜索树转换为累加树

538. 把二叉搜索树转换为累加树

题目:

给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。

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

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

注意:本题和 1038: https://leetcode-cn.com/problems/binary-search-tree-to-greater-sum-tree/ 相同

示例:

示例 1:

img

输入:[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]

题目解释:

是不是没读懂题目?没关系,举个例子你就明白了:

比如说根节点4转换为累加树之后为什么新值是30?按题目中的意思就是大于等于根节点4的原来二叉树的值全部加起来,即根节点4+(它的右子树)= 4 + 6 + 5 + 7 + 8 = 30,同理根节点4的左孩子节点1,那就是要将大于等于1的原二叉树的值全部加起来,那就是从自身开始1 + 2 + 3 + (之前根节点4累加的值,因为它们都比1大) = 36,所以新值为36,依此类推。

这样子看来,题目是读懂了,但是没啥规律啊?解不了题啊?

根据题目的提示会发现原二叉树是满足以下性质的:

  1. 若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
  2. 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
  3. 它的左、右子树也分别为二叉搜索树。

说明原二叉树就是二叉搜索树,而累加树则刚好与二叉搜索树性质相反,刚好二叉搜索树的中序遍历是一个单调递增的有序序列。那么是否意味着累加树的逆序中序遍历是一个单调递减的有序序列。

二叉搜索树的中序遍历:[0、1、2、3、4、5、6、7、8]

累加树的中序遍历:[36、36、35、33、30、26、24、15、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]

提示:

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

解题:

方法一:反序中序遍历

所以根据我的题目解释,这样我们只需要反序中序遍历该二叉搜索树,记录过程中的节点值之和,并不断更新当前遍历到的节点的节点值,即可得到题目要求的累加树。

class Solution {
public:int sum = 0;TreeNode* convertBST(TreeNode* root) {if(root != nullptr) {convertBST(root->right);sum += root->val;root->val = sum;convertBST(root->left);}return root;}
};

复杂度分析:

  • 时间复杂度:O(n),其中 n 是二叉搜索树的节点数。每一个节点恰好被遍历一次。

  • 空间复杂度:O(n),为递归过程中栈的开销,平均情况下为 O(log⁡n),最坏情况下树呈现链状,为 O(n)。

看不懂代码的可以去调试一下代码就懂了

#include <iostream>// 二叉树节点定义
struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};class Solution {
public:TreeNode* convertBST(TreeNode* root) {if(root != nullptr) {convertBST(root->right);sum += root->val;root->val = sum;convertBST(root->left);}return root;}private:int sum = 0; // 成员变量用于记录累加值
};// 中序遍历打印二叉树
void inOrderTraversal(TreeNode* root) {if (root) {inOrderTraversal(root->left);std::cout << root->val << " ";inOrderTraversal(root->right);}
}int main() {// 示例用法// 创建一棵示例二叉搜索树TreeNode* root = new TreeNode(4);root->left = new TreeNode(1);root->right = new TreeNode(6);root->left->left = new TreeNode(0);root->left->right = new TreeNode(2);root->right->left = new TreeNode(5);root->right->right = new TreeNode(7);root->left->right->right = new TreeNode(3);root->right->right->right = new TreeNode(8);// 创建 Solution 对象Solution solution;// 转换为累加树(使用你提供的方式)TreeNode* greaterSumTree = solution.convertBST(root);// 打印累加树的中序遍历结果std::cout << "累加树的中序遍历结果: ";inOrderTraversal(greaterSumTree);std::cout << std::endl;return 0;
}

下面给出部分调试过程:

一开始先一直递归,直到右子树的末尾叶子节点8

在这里插入图片描述
在这里插入图片描述

然后递归里的执行:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

方法二:Morris 遍历

这个方法不搞了,第一个理解透彻就挺累的了。有需要自己去看吧

538. 把二叉搜索树转换为累加树 - 力扣(LeetCode)

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

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

相关文章

浅谈联网汽车安全漏洞

“智能网联汽车存在内生共性问题&#xff0c;即软硬件的漏洞后门&#xff0c;基于此进行的网络攻击可以直接带来勒索、盗窃、大规模车辆恶意操控风险&#xff0c;还有数据泄露等网络安全事件。如果内生的漏洞后门问题不解决&#xff0c;系统自身难保&#xff0c;很难谈系统安全…

QTextEdit多行富文本框控件

​锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计21条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话…

推荐你一个基于Koin, Ktor Paging等组件的KMM Compose Multiplatform项目

推荐你一个基于Koin, Ktor & Paging等组件的KMM Compose Multiplatform项目 Kotlin Multiplatform Mobile&#xff08;KMM&#xff09;已经从一个雄心勃勃的想法发展成为一个稳定而强大的框架&#xff0c;为开发人员提供了在多个平台上无缝共享代码的能力。通过最近的稳定…

跨境电商系统开发:开启全球贸易新纪元

随着全球电子商务的飞速发展&#xff0c;跨境电子商务已经成为了一种日益重要的贸易形式。跨境电商系统开发&#xff0c;为企业提供了全新的商业机遇&#xff0c;打开了全球贸易的新纪元。 跨境电商系统开发&#xff0c;旨在实现不同国家和地区之间的电子商务交易&#xff0c;促…

【机器学习】迁移学习

迁移学习&#xff1a;给定一个有标记的源域和一个无标记的目标域。这两个领域的数据分布不同。迁移学习的目的就是要借助源域的知识&#xff0c;来学习目标域的知识(标签)。或是指基于源域数据和目标域数据、源任务和目标任务之间的相似性&#xff0c;利用在源领域中学习到的知…

计算机毕业设计|基于SpringBoot+MyBatis框架的电脑商城的设计与实现(商品和购物车)

计算机毕业设计|基于SpringBootMyBatis框架的电脑商城的设计与实现&#xff08;商品和购物车&#xff09; 商品热销排行 1 商品-创建数据表 1.使用use命令先选中store数据库。 USE store;2.在store数据库中创建t_product数据表。 CREATE TABLE t_product (id int(20) NOT …

Git开发实用技巧

文章目录 一图胜千言&#xff1a;

SCI一区级 | Matlab实现GWO-CNN-LSTM-selfAttention多变量多步时间序列预测

SCI一区级 | Matlab实现GWO-CNN-LSTM-selfAttention多变量多步时间序列预测 目录 SCI一区级 | Matlab实现GWO-CNN-LSTM-selfAttention多变量多步时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现GWO-CNN-LSTM-selfAttention灰狼算法优化卷积长短…

介绍比特币上的 sCrypt 开发平台

最强大的基础设施和工具套件&#xff0c;可轻松构建和扩展您的 dApp 杀手级应用在哪里&#xff1f; 尽管比特币在小额支付、国际汇款和供应链管理等广泛用例中具有颠覆性潜力&#xff0c;但在推出 14 年后&#xff0c;我们还没有看到一款非常受欢迎并被主流采用的杀手级应用。 …

echart一键生成迁徙图

echart_move 介绍 echart迁徙图&#xff0c;选择起点和目的地生成迁徙图 软件架构 html echarts js 使用说明 将文件放到同一目录下打开index.html即可 默认是小飞机图标&#xff0c;如果想修改图标&#xff0c;将图片放到同一目录&#xff0c;如1.svg 代码修改为对应位…

这一次,Python 真的有望告别 GIL 锁了?

Python 中有一把著名的锁——全局解释器锁&#xff08;Global Interpreter Lock&#xff0c;简写 GIL&#xff09;&#xff0c;它的作用是防止多个本地线程同时执行 Python 字节码&#xff0c;这会导致 Python 无法实现真正的多线程执行。&#xff08;注&#xff1a;本文中 Pyt…

DEM分析

一、实验名称&#xff1a; DEM分析 二、实验目的&#xff1a; 通过本实验练习&#xff0c;掌握DEM的建立与应用基本方法。 三、实验内容和要求&#xff1a; 实验内容&#xff1a; 利用ARCGIS软件相关分析工具及实验数据&#xff0c;创建DEM&#xff0c;并计算相应坡度的区…

webshell之编码免杀

Unicode编码 jsp支持unicode编码&#xff0c;如果杀软不支持unicode查杀的话&#xff0c;基本上都能绕过 注意这里的\uuuu00可以换成\uuuu00uuu...可以跟多个u达到绕过的效果 将代码&#xff08;除page以及标签&#xff09;进行unicode编码&#xff0c;并条件到<%%>标签…

sCrypt 在英国伦敦 Exeter 大学讲学

6月5日&#xff0c;sCrypt CEO晓晖和他的两位同事在英国伦敦Exeter大学举行了一场精彩的讲座。刘晓晖向听众们详细介绍了sCrypt智能合约开平台&#xff0c;并演示了如何使用sCrypt来开发基于比特币的智能合约。他用生动形象的语言&#xff0c;深入浅出地解释了这个领域复杂而又…

精通Nginx(18)-FastCGI/SCGI/uWSGI支持

最初用浏览器浏览的网页只能是静态html页面。随着社会发展,动态获取数据、操作数据需要变得日益强烈,CGI应运而生。CGI(Common Gateway Interface)公共网关接口,是外部扩展应用程序与静态Web服务器交互的一个标准接口。它可以使外部程序处理浏览器送来的表单数据并对此作出…

24. 深度学习进阶 - 矩阵运算的维度和激活函数

Hi&#xff0c;你好。我是茶桁。 咱们经过前一轮的学习&#xff0c;已经完成了一个小型的神经网络框架。但是这也只是个开始而已&#xff0c;在之后的课程中&#xff0c;针对深度学习我们需要进阶学习。 我们要学到超参数&#xff0c;优化器&#xff0c;卷积神经网络等等。看…

Node——npm包管理器的使用

Node.js使用npm对包进行管理&#xff0c;其全称为Node Package Manager&#xff0c;开发人员可以使用它安装、更新或者卸载Node.js的模块 1、npm包管理器基础 1.1、npm概述 npm是Node.js的标准软件包管理器&#xff0c;其在2020年3月17日被GitHub收购&#xff0c;而且保证永…

机器学习笔记 - 3D对象检测技术路线调研(未完)

一、3D对象检测简述 3D对象检测是计算机视觉中的一项任务&#xff0c;其目标是根据对象的形状、位置和方向在 3D 环境中识别和定位对象。它涉及检测物体的存在并实时确定它们在 3D 空间中的位置。这项任务对于自动驾驶汽车、机器人和增强现实等应用至关重要。 1、基本流程 给定…

虾皮买手号怎么弄的

想要拥有虾皮买手号&#xff0c;可以使用shopee买家通系统进行自动化注册&#xff0c;这款软件目前支持菲律宾、泰国、马来西亚、越南、巴西、印度尼西亚等国家使用。 软件注册流程简单方便&#xff0c;首先我们需要先准备好手机号&#xff0c;因为现在注册虾皮买家号基本上都是…

C语言基础篇5:指针(一)

指针是C语言的核心、精髓所在&#xff0c;用好了指针可以在C语言编程中起到事半功倍的效果。指针一方面可以提高程序的编译效率和执行速度&#xff0c;而且还可以通过指针实现动态的存储分配&#xff0c;另一方面使用指针可使程序更灵活&#xff0c;便于表示各种数据结构&#…