Leecode 538 - 把二叉搜索树转换为累加树(Leecode 1038)

1 题目

Leecode 538:https://leetcode-cn.com/problems/convert-bst-to-greater-tree/

Leecode 1038:https://leetcode-cn.com/problems/binary-search-tree-to-greater-sum-tree

2 题意

给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。

例如:

输入: 原始二叉搜索树:
              5
            /   \
           2     13

输出: 转换为累加树:
             18
            /   \
          20     13

3 思路

author's blog == http://www.cnblogs.com/toulanboy/

3. 1 二叉搜索树

(1)定义:若一颗二叉树,其左边的节点都小于等于根节点,右边的节点都大于等于根节点,那么该树被称为二叉搜索树。

(2)特征:中序遍历的结果是个递增序列。

3.2 解题思路

题目需要我们把每个节点的值更改为,大于等于该值的所有数值的和(包含他本身)。

我们可以借助遍历获得每个点的数值,然后统计起来利用。

(1)一般的思维:

  • 可以考虑先遍历每个点,记录每个点的情况。
  • 由于中序便利出来的是有序的升序序列,那么我们可以得知大于等于某个点的情况。
  • 只需再遍历一遍进行更新。但是这个方法需要2次遍历,而且需要统计后缀和。

(2)进一步思考

这里看了题解才恍然大悟。惭愧(--。

较好的方案:执行反的中序遍历,遍历逻辑为:右子树、根节点、左子树,就会得到一个降序序列。在这次遍历的过程中,当我们遍历到第i个点时,大于等于第i个点所有节点都已经被遍历,故可以直接得到第i个点应该被更新的数值。

4 代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
//author's blog == http://www.cnblogs.com/toulanboy/
class Solution {//代码是Leecode 538的
public:
    int sum = 0;
    void get_tree_sum(TreeNode * root){
        if(root == NULL)
            return;
        get_tree_sum(root->right);
        sum += root->val;//累加大于等于当前值的所有数值和
        root->val = sum;//当前节点的值 便是 上述统计的和
        get_tree_sum(root->left);
        return;
    }
    TreeNode* convertBST(TreeNode* root) {
        get_tree_sum(root);
        return root;
    }
};
posted @ 2020-09-21 22:05  偷懒人  阅读(121)  评论(0编辑  收藏  举报