Leetcode每日一题--538. 把二叉搜索树转换为累加树

155 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第19天,点击查看活动详情

前言

算法的重要性不言而喻!区分度高!

现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。

说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!

提前入门学习书籍:CPrimerPlus、大话数据结构

image-20220705103735001

刷题网站

代码随想录 (programmercarl.com)

leetcode

我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以

刷题嘛,最重要的就是坚持了!!!

画图软件

OneNote

这个要经常用,遇见不懂的流程的话就拿它画一画!

笔记软件

Typoral

题目

leetcode.cn/problems/co…

解析

今日新概念,累加树。

使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。

我们举例子理解:

这是一个有序数组[2, 5, 13],求从后到前的累加数组,也就是[20, 18, 13]

换成数组是不是更好理解了,只不过题目中给的是树而已。那么我们仔细看这个树,它的节点有什么值变化有什么规律呢?

反中序遍历累加节点的值,就是把中序遍历的顺序翻过来遍历节点的值进行累加

ok,依旧是用递归的方法来解决这个问题!

递归三部曲

  1. 确定递归的参数和返回值

因为我们是遍历整棵树,所以不需要返回值,参数的话我们需要保存前一个节点,以便于做累加操作


public void convertBST1(TreeNode root) {}

  1. 确定递归终止的条件

递归终止就是遇见空节点了,那就直接返回呗!

if (root == null) {
    return;
}


  1. 确定单层递归的逻辑

递归的目的就是做累加,然后保证反中序遍历就可以完成

我们来解释下这两行代码,第一个行是把当前节点的值赋给sum,第二行是把值在给当前节点

叶子结点进入逻辑之后,首先sum是等于该叶子结点的值,之后再把sum的值赋值给该节点,这里完成了第一次累加

当递归往上返回的时候,就开始不断的做累加,也就是完成了我们题目的要求了

sum += root.val;

root.val = sum;


convertBST1(root.right);
sum += root.val;
root.val = sum;
convertBST1(root.left);

完整代码

class Solution {
    int sum;
    public TreeNode convertBST(TreeNode root) {
        sum = 0;
        convertBST1(root);
        return root;
    }

    // 按右中左顺序遍历,累加即可
    public void convertBST1(TreeNode root) {
        if (root == null) {
            return;
        }
        convertBST1(root.right);
        sum += root.val;
        root.val = sum;
        convertBST1(root.left);
    }
}