LeetCode 1038. 从二叉搜索树到更大和树:(反)中序遍历

【LetMeFly】1038.从二叉搜索树到更大和树:(反)中序遍历

力扣题目链接:https://leetcode.cn/problems/binary-search-tree-to-greater-sum-tree/

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

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

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

 

示例 1:

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

 

提示:

  • 树中的节点数在 [1, 100] 范围内。
  • 0 <= Node.val <= 100
  • 树中的所有值均 不重复 。

 

注意:该题目与 538: https://leetcode-cn.com/problems/convert-bst-to-greater-tree/  相同

方法一:(反)中序遍历

二叉搜索树的中序遍历(左子→根→右子)得到的序列是非递减序列。反之,右子→根→左子得到的序列就是非递增序列。

“反中序遍历”的过程中,我们只需要使用一个遍历记录“当前所有遍历过的元素的和”,即为大于等于当前元素的所有元素的和。

  • 时间复杂度 O ( n ) O(n) O(n),其中 n n n是二叉树节点个数
  • 空间复杂度 O ( n ) O(n) O(n),最坏情况下二叉树退化成一条链,递归占用空间 O ( n ) O(n) O(n)

AC代码

C++
class Solution {
   
private:
    int last;

    void dfs(TreeNode* root) {
   
        if (!root) {
   
            return;
        }
        dfs(root->right);
        last += root->val;
        root->val = last;
        dfs(root->left);
    }
public:
    TreeNode* bstToGst(TreeNode* root) {
   
        last = 0;
        dfs(root);
        return root;
    }
};
Python
# from typing import Optional

# # Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

class Solution:
    def dfs(self, root: Optional[TreeNode]) -> None:
        if not root:
            return
        self.dfs(root.right)
        self.last += root.val
        root.val = self.last
        self.dfs(root.left)
    
    def bstToGst(self, root: TreeNode) -> TreeNode:
        self.last = 0
        self.dfs(root)
        return root

同步发文于CSDN,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/134782862

相关推荐

  1. LeetCode 94.

    2023-12-07 22:42:08       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-07 22:42:08       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-07 22:42:08       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-07 22:42:08       82 阅读
  4. Python语言-面向对象

    2023-12-07 22:42:08       91 阅读

热门阅读

  1. sass 学习笔记

    2023-12-07 22:42:08       44 阅读
  2. [Ubuntu 20.04] 使用Netplan配置网络静态IP

    2023-12-07 22:42:08       53 阅读
  3. ubuntu离线安装包

    2023-12-07 22:42:08       49 阅读
  4. C++ 多线程 atomic

    2023-12-07 22:42:08       62 阅读
  5. 算法通关村——用4kb寻找重复元素

    2023-12-07 22:42:08       64 阅读
  6. CentOS一键安装docker脚本

    2023-12-07 22:42:08       56 阅读
  7. Nginx

    Nginx

    2023-12-07 22:42:08      52 阅读
  8. C语言的条件编译格式

    2023-12-07 22:42:08       49 阅读
  9. 浅谈类的封装

    2023-12-07 22:42:08       64 阅读
  10. 详细解读python里的列表

    2023-12-07 22:42:08       51 阅读