【LeetCode】538. Convert BST to Greater Tree

问题描述

问题链接:https://leetcode.com/problems/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

我的代码

一开始的时候没反应过来什么是BST,后来观察了一下,想起来了。于是就很自然的想到先用先序遍历把树转成数组,就得到了一个从小到大排序的数组,然后从后往前累加就可以了。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    List<TreeNode> treeList = new ArrayList<TreeNode>();

    public TreeNode convertBST(TreeNode root) {
        /*
        思路:采取先序遍历的方式,把所有节点加入到列表中,然后从后面起依次向前加即可
        */
        if(root == null || root.left == null && root.right == null){
            return root;
        }
        goThrough(root);

        int len = treeList.size();
        int sum = treeList.get(len - 1).val; // 保存所有比当前节点大(即list中排在当前节点之后的元素)的和

        for(int i = len - 2; i >= 0; i--){
            int val = treeList.get(i).val;
            treeList.get(i).val += sum;
            sum += val;
        }

        return root;
    }

    private void goThrough(TreeNode root){
        if(root.left != null){
            goThrough(root.left);
        }
        treeList.add(root);
        if(root.right != null){
            goThrough(root.right);
        }
    }
}

竟然看不到打败了多少代码,差评!

讨论区

Java Recursive O(n) time

链接地址:https://discuss.leetcode.com/topic/83455/java-recursive-o-n-time

这个好聪明啊,直接后序遍历好了。

Since this is a BST, we can do a reverse inorder traversal to traverse the nodes of the tree in descending order. In the process, we keep track of the running sum of all nodes which we have traversed thus far.

public 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);
    }

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值