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

题目详情

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

解题思路及代码

本题是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;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_34687559/article/details/109393292
今日推荐