毁offer还这么理直气壮。。。

dcb88240c9f28ca3448c4d609590c3e1.gif

精品推荐:

《征服数据结构》《经典图论算法》

奇葩年年有,今年特别多,最近一网友本来打算第二天入职的,结果被通知不用去了,有需求在过去,这明显是被放鸽子了。如果不想要可以提前说,别人也可以继续找,不要等到快入职的时候别人问了才说。网友建议:狠狠骂他,毁offer都这么理直气壮。

fc0b117d839851acafc18eb5e8d2d100.png

网友回复:

15da5532057675351dc942479acc031f.png

--------------下面是今天的算法题--------------

来看下今天的算法题,这题是LeetCode的第538题:把二叉搜索树转换为累加树

问题描述

来源:LeetCode第538题

难度:中等

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

示例1:

711e17931257406a5f2bf590c063ea12.png

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

  • 树中的节点数介于 0 和 10^4 之间。

  • 每个节点的值介于 -10^4 和 10^4 之间。

  • 树中的所有值 互不相同 。

  • 给定的树为二叉搜索树。

问题分析

这题是让把二叉搜索树中每个节点的值改成所有大于等于该节点值的和,考察的也是二叉搜索树的特性。

如果这题换一种说法,把一个有序数组中每个元素变成所有大于等于它的元素和,我们只需要从后往前遍历数组然后累加即可,因为有序数组中每一个元素后面的值都是大于它的。

但这里是一棵二叉搜索树,二叉搜索树的一个重要特性就是它的中序遍历结果是有序的,我们只需要把中序遍历反过来,也就是先遍历右子树,在访问当前节点,最后在遍历左子树,这样就相当于二叉树中所有的节点从大往小的顺序访问,这个时候就可以参考有序数组的操作了。

JAVA:

int sum = 0;// 累加值

public TreeNode convertBST(TreeNode root) {
    if (root == null)
        return null;
    convertBST(root.right);// 递归右子树
    sum += root.val;
    root.val = sum;
    convertBST(root.left);// 递归左子树
    return root;
}

C++:

public:
    int sum = 0;// 累加值
    TreeNode *convertBST(TreeNode *root) {
        if (root == nullptr)
            return nullptr;
        convertBST(root->right);// 递归右子树
        sum += root->val;
        root->val = sum;
        convertBST(root->left);// 递归左子树
        return root;
    }

Python:

def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
    s = 0  # 累加值

    def dfs(node):
        if not node:
            return node
        dfs(node.right)  # 递归右子树
        nonlocal s
        s += node.val
        node.val = s
        dfs(node.left)  # 递归左子树
        return node

    dfs(root)
    return root

64b36aa677e596bd88a103c81b710ae3.gif

笔者简介

博哥,真名:王一博,毕业十多年,《算法秘籍》作者,专注于数据结构和算法的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以下载我整理的1000多页的PDF算法文档。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据结构和算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值