欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LeetCode BST专题 538 把二叉搜索树转换成累加树 java

程序员文章站 2022-06-07 14:46:25
...

题目详情

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

解题思路及代码

本题是BST,关于BST我们要明确一点,中序遍历是输出从小到大的有序数列。(关于中序遍历,BST可以看二叉树(& BST)的前序、中序、后序遍历,递归与迭代,java)
然后我们这里每个点的新值是当前值+所有大于当前值的值,若我们有一个有序数列,则该点的新值为:从旧值开始,一直累加到尾。
当然,我们不存在先中序遍历一遍,然后再访问数组,再去遍历一遍修改,这样太麻烦了。
我们直接从有序数列的最后一个往前累加,累加到旧值。
如何从后往前走呢? 只需将中序遍历翻转一下即可。

在中序遍历时,我们是

void dfs(TreeNode root) {
    dfs(root.left);
    visit(root);
    dfs(root.right);
}

这里我们反一下,先放right,后放left即可。

具体代码如下:

class Solution {
    private int sum = 0;
    public TreeNode convertBST(TreeNode root) {
        //每个数的新值就是其父节点、父节点的右子树(如果有父节点的话)+右子节点的和
        //中序遍历的话是从小到大的有序对吧,如果我把中序的左和右改一下,是不是就是从大到小遍历了
        //然后每个点的值就是自己+之前的sum
        //应该就是这样
        // int sum = 0;
        dfs(root);
        return root;
    }

    public void dfs(TreeNode node){
        if(node==null){
            return;
        }
        dfs(node.right);
        sum += node.val;
        node.val = sum;
        dfs(node.left);
        return;
    }
}