1038. Binary Search Tree to Greater Sum Tree, 这个方法好!

Given the root of a binary search tree with distinct values, modify it so that every node has a new value equal to the sum of the values of the original tree that are greater than or equal to node.val.

As a reminder, a binary search tree is a tree that satisfies these constraints:

  • The left subtree of a node contains only nodes with keys less than the node's key.
  • The right subtree of a node contains only nodes with keys greater than the node's key.
  • Both the left and right subtrees must also be binary search trees.

 

Example 1:

Input: [4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
Output: [30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]

 

Constraints:

  1. The number of nodes in the tree is between 1 and 100.
  2. Each node will have value between 0 and 100.
  3. The given tree is a binary search tree

一开始的思路,没想到原树改造,所以有了下面的思路。

class Solution {
public:
    TreeNode* bstToGst(TreeNode* root) {
        vector<int> helper;
        midSearch(root, helper);

        TreeNode* res = nullptr;
        sumCopy(root, res, helper);

        return res;
    }
    private:
    void midSearch(TreeNode* root, vector<int>& helper)
    {
        if(root == nullptr)
            return;
        midSearch(root->left, helper);
        helper.push_back(root->val);
        midSearch(root->right, helper);
    }
    void sumCopy(TreeNode* root, TreeNode* &res, vector<int>& helper)
    {
        if(root == nullptr)
            return;

        res = new TreeNode();
        int oldV = root->val;
        int pos = findInHelper(helper, oldV);

        int newV = std::accumulate(helper.begin() + pos, helper.end(), 0);
        res->val = newV;

        sumCopy(root->left, res->left, helper);
        sumCopy(root->right, res->right, helper);
    }
    int findInHelper(vector<int>& helper, int v)
    {
        int start = 0;
        int end = helper.size() - 1;
        while(start <= end)
        {

            int mid = (end + start)/2;

            if(helper[mid] == v)
                return mid;
            if(helper[mid] < v)
                start = mid + 1;
            else
                end = mid - 1;
        }
        return -1;
    }
};

运行结果还行,

Runtime: 0 ms, faster than 100.00% of C++ online submissions for Binary Search Tree to Greater Sum Tree.

Memory Usage: 8 MB, less than 5.36% of C++ online submissions for Binary Search Tree to Greater Sum Tree.

其实自己都觉得繁琐,用了中序遍历,还用了2分查找,算是用全了。

后来反馈别人的思路,喜欢这一个。

想想也是,新的节点值,就是从右边开始遍历的积累数值啊,咋没想到呢。

class Solution {
public:
    
    void traversal(TreeNode* node)       // Reverse inorder traversal to traverse BST in descending order
    {
        if(!node)
            return;
        traversal(node -> right);
        sum += node -> val;
        node -> val = sum;
        traversal(node -> left);
    }
    
    TreeNode* bstToGst(TreeNode* root) 
    {
        traversal(root);
        return root;
    }
private:
    int sum;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值