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;为开发人员提供了在多个平台上无缝共享代码的能力。通过最近的稳定…

平衡二叉树(AVL)

&#xff08;附代码&#xff0c;简洁好理解&#xff09; 目录 什么是平衡二叉树&#xff1f; 如何保证二叉树平衡&#xff1f; 左旋/右旋 左右双旋/右左双旋 代码 树的结构&#xff1a; 树的高度与平衡因子&#xff1a; 左/右旋&#xff1a; 平衡维护&#xff1a; …

70-76-堆、贪心算法

LeetCode 热题 100 文章目录 LeetCode 热题 100堆70. 中等-数组中的第K个最大元素71. 中等-前K个高频元素72. 困难-数据流中的中位数 贪心算法73. 简单-买卖股票的最佳时机74. 中等-跳跃游戏75. 中等-跳跃游戏II76. 中等-划分字母区间 本文存储我刷题的笔记。 堆 70. 中等-数组…

数字图像处理Python实现-图像特效与卷积滤波

图像特效与卷积滤波 文章目录 图像特效与卷积滤波1、准备2、快速了解卷积滤波3、应用卷积滤波在这篇文章中,我们将探索如何使用卷积内核来实现图像的模糊、锐化、轮廓和浮雕等特效。 1、准备 像往常一样,我们导入 numpy 和 matplotlib 等库。 此外,我们从 skimage 和 scipy…

命令行编译java

十分惭愧&#xff0c;java学了有七八年了&#xff0c;现在才来写这个博客&#xff0c;但是相信正确的事情即使迟到也好过不到&#xff0c;希望借助博客可以帮助记忆。 单个java文件 这个相信大家都知道&#xff0c;只是为了结构明确。这里java会找到内部的main方法。必须是在…

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

随着全球电子商务的飞速发展&#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灰狼算法优化卷积长短…

中国加氢催化剂行业研究与投资前景报告(2023版)

内容简介&#xff1a; 炼油厂催化剂市场因类型、材料和地区而分散。不同的产品类型包括流化催化裂化&#xff08;FCC)、烷基化、重整和异构化、加氢处理等。基于材料&#xff0c;产品分为沸石、金属、化合物等催化剂。钼、钒、镍、钴和其他贵金属和稀土金属属于用于金属基炼油…

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

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

Java 从丑陋的典例代码来谈谈卫语句(guard statement)if else

最近在重构些老项目&#xff0c;发现了些比较典型的代码块。 想到这些常见的写法&#xff0c;可能初学者还是比较容易‘产出’的&#xff0c;所以决定拎出来说说。 实例&#xff1a; 可以看到&#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…

Controller 层代码就该这么写,简洁又优雅!

一个优秀的 Controller 层逻辑 说到 Controller&#xff0c;相信大家都不陌生&#xff0c;它可以很方便地对外提供数据接口。它的定位&#xff0c;我认为是「不可或缺的配角」。 说它不可或缺是因为无论是传统的三层架构还是现在的 COLA 架构&#xff0c;Controller 层依旧有…

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;并条件到<%%>标签…