538-Convert BST to Greater Tree

Description

Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original BST is changed to the original key plus sum of all keys greater than the original key in BST.


Example:

Input: The root of a Binary Search Tree like this:
              5
            /   \
           2     13

Output: The root of a Greater Tree like this:
             18
            /   \
          20     13

问题描述

给定二叉排序树, 转换该二叉排序树, 使得其每个节点的值为大于它的值的节点值之和


问题分析

“传统的”中序遍历, 获取的二叉排序树的递增值序列, 那么我们不妨转换下思想, 将遍历左右子树的顺序颠倒, 使得遍历的值为由大到小排列, 通过sum累计值, 将其赋值给遍历的当前节点即可

注意一下, 对于二叉排序树来说, 中序遍历通常比较重要(递增值序列), 一般遇到问题可以优先考虑


解法1

/*
这种解法不太优雅
首先通过"传统的"中序遍历获取递增值序列, 将该序列存储在一个List中, 然后逆序累加
*/
class Solution {
    private int index;
    private List<Integer> res;

    public TreeNode convertBST(TreeNode root) {
        index = 0;
        res = new ArrayList<Integer>();
        TreeNode node = root;
        inorder(node);

        int sum = 0;
        for(int i = res.size() - 1;i >= 0;i--){
            sum += res.get(i);
            res.set(i,sum);
        }

        node = root;
        convert(node);

        return root;
    }

    public void convert(TreeNode root){
        if(root == null) return;

        convert(root.left);
        root.val = res.get(index++);
        convert(root.right);
    }

    public void inorder(TreeNode root){
        if(root == null) return;

        inorder(root.left);
        res.add(root.val);
        inorder(root.right);
    }
}

解法2

//这种解法就是问题分析中的解法
class Solution {
    int sum = 0;

    public TreeNode convertBST(TreeNode root) {
        convert(root);

        return root;
    }
    public void convert(TreeNode cur) {
        if (cur == null) return;

        convert(cur.right);
        cur.val += sum;
        sum = cur.val;
        convert(cur.left);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值