538. 把二叉搜索树转换为累加树

题目描述:

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

 

例如:

思想:

此题目要求我们在一个二叉搜索树上修改渐进线性数目个节点,所以一个高效的解法应该遍历每个节点一次。解法的关键在于应该按照节点值降序遍历所有节点,同时记录我们已经遍历过的节点值的和,并把这个和加到当前节点的值中。这种遍历树的方法被称作 反序中序遍历 ,它确保我们按我们想要的顺序遍历每一个节点。这个算法的基本思想是遍历一个没有遍历过的节点之前,先将大于点值的点都遍历一遍。这些点都在哪里呢?就在右子树里面。

利用回溯思想,一个反序中序遍历的方法是通过递归实现。通过调用栈回到之前的节点,我们可以轻松地反序遍历所有节点。

在递归方法中,维护一些递归调用过程中可以访问和修改的全局变量(sum)。首先判断当前访问的节点是否存在,如果存在就递归右子树,递归回来的时候更新总和和当前点的值,然后递归左子树。如果我们分别正确地递归 root.right 和 root.left ,那么就能正确地用大于某个节点的值去更新此节点,然后才遍历比它小的值。

 

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
private:
    int sum = 0;   // sum的声明要在函数外面
public:
    TreeNode* convertBST(TreeNode* root) {
        if(root != NULL){
            convertBST(root->right);
            sum += root->val;
            root->val = sum;
            convertBST(root->left);
        }
        return root;
    }
};

 

posted @ 2020-05-12 10:13  thefatcat  阅读(105)  评论(0编辑  收藏  举报