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


题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/convert-bst-to-greater-tree

题目


给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。

例如:

输入: 原始二叉搜索树:5/   \2     13输出: 转换为累加树:18/   \20     13

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

解题思路


思路:中序遍历

首先,先审题。题目给定一个二叉搜索树,要将其转换为累加树。这道题与站内 1038 题是一样的,可能本题的一些描述看起来会有些模糊,不妨到 1038 题中看看。

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

这道题的关键是给定的树是二叉搜索树,这里说下二叉搜索树的概念:

  • 左子树不为空时,左子树所有节点值均小于根节点值;
  • 右子树不为空,右子树的所有节点值均大于根节点值;
  • 左右子树也必须是二叉搜索树。

至于题目中要求转换的累加树,这里题目给出的解释是:使得每个节点的值是原来的节点值加上所有大于它的节点值之和。

根据二叉搜索树的定义,我们知道它的中序遍历输出结果是升序的序列。例如示例:

输入: 原始二叉搜索树:5/   \2     13

中序遍历返回的结果是 [2, 5, 13]

现在题目要求我们在当前节点值的基础上加上所有大于它的节点值之和作为当前节点的新值。

那么我们可以考虑先访问右子树,进行反向中序遍历,那么得到的序列,将是降序排列。那么我们只需要在当前值的基础上,加上序列中前面所有大于它的值作为新值。例如示例(反向中序遍历)

输入: 原始二叉搜索树:5/   \2     13

反向中序遍历得到的结果 [13, 5, 2]

我们可看到这里节点值递减,那么我们要转换更新值时,只要将当前节点前面的值累加,然后再与当前值相加作为新值即可。

这里的转换过程图示如下:

那么根据上面的分析,整理下思路:

  • 处理特殊情况,根节点为空,直接返回;
  • 定义变量 total,存储节点值的累加值;
  • 反向中序遍历二叉搜索树:
    • 递归右子树,将节点值累加到 total;
    • 然后处理当前节点,先将值累加到 total,然后将 total 作为新值赋给当前节点值;
    • 最后递归左子树,同样将值累加到 total,然后更新值。

具体代码如下。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution:def __init__(self):# 定义变量,用以存储累加值self.total = 0def convertBST(self, root: TreeNode) -> TreeNode:def dfs(root):if not root:return# 递归右子树if root.right:dfs(root.right)# 递归左子树之前,# 先处理值,累加值,并重新赋值给当前节点self.total += root.valroot.val = self.total# 递归左子树if root.left:dfs(root.left)dfs(root)return root

欢迎关注


公众号 【书所集录】

LeetCode 538. 把二叉搜索树转换为累加树 | Python相关推荐

  1. [二叉树遍历|BST]leetcode 538 把二叉搜索树转换为累加树

    [二叉树遍历|BST]leetcode 538 把二叉搜索树转换为累加树 1.题目 题目链接 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree) ...

  2. Leetcode 538. 把二叉搜索树转换为累加树 C++

    Leetcode 538. 把二叉搜索树转换为累加树 题目 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加 ...

  3. LeetCode 538. 把二叉搜索树转换为累加树(逆中序 根右左)

    文章目录 1. 题目 2. 逆中序(根右左,降序循环遍历) 1. 题目 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原 ...

  4. leetcode 538. 把二叉搜索树转换为累加树 思考分析

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

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

    给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和.(二叉查找树(Binary Sea ...

  6. 【Leetcode_总结】538. 把二叉搜索树转换为累加树 - python

    Q: 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和. 例如: 输入: 二叉搜索树 ...

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

    思路:ST的中序遍历就是从小到大,那么反过来就是从大到小,然后通过num累加  int num =0;public TreeNode convertBST(TreeNode root) {if(roo ...

  8. LeetCode系列538—把二叉搜索树转换为累加树

    题意 538. 把二叉搜索树转换为累加树 题解 方法一:反序中序遍历 class Solution {private:int sum = 0; public:TreeNode* convertBST( ...

  9. leetcode c++未初始化_LeetCode 力扣官方题解 | 538. 把二叉搜索树转换为累加树

    力扣 538. 把二叉搜索树转换为累加树(点击查看题目) 力扣​leetcode-cn.com 题目描述 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater ...

最新文章

  1. dp cf 20190615
  2. 中国碳纤维风电叶片行业“十四五”发展规划及投资可行性分析报告2022-2028年版
  3. redis 主从哨兵模式搭建
  4. perl和python的相互调用
  5. c语言编程 要有菜单工作界面,使用C语言图形界面进行编程
  6. 数据中台-标签体系介绍
  7. Python爬虫实战——今日头条图片下载
  8. pythonend输出最后没有逗号_python不换行之end=与逗号的意思及用途
  9. aspose 插入图片的方法
  10. 【无标题】百度地图的基本使用
  11. 什么P图软件可以换发型?照片换分享软件分享
  12. JavaSE基础阶段学习笔记
  13. 如何学习微信公众平台开发?
  14. Greenplum6 JDBC insert性能媲美MySQL
  15. 微信群很多怎么管理?针对这个问题,今天教你几招。
  16. cocos-creator学习笔记1(旋转,位置移动,键盘监控移动基础)
  17. c# IPAddress类
  18. 2022-雨课堂-工程伦理期末考试答案
  19. matlab2021a安装包
  20. 一张表看懂MOS管参数——(业务员、采购应知应会的MOS管参数)

热门文章

  1. mysql 统计请假天数_php统计员工请假天数,最好能有代码说明
  2. nginx日志文件管理【nginx】
  3. Matlab与Arduino车牌识别的完整系统(2)
  4. svm预测股价 python_小蛇学python(4)利用SVM预测股票涨跌
  5. Android原生加载显示在线PDF链接
  6. 035-JAVA语言实现下拉菜单与弹出菜单功能
  7. 意式极简轻奢风格装修
  8. k开头的英文单词计算机专业,以k开头的英文单词k字开头的英文单词
  9. cd permission denied linux,permission denied这是什么意思?肿么破?
  10. 杭州创新创业大赛人才引进政策