Convert BST to Greater Tree

题目:

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.

样例

Given a binary search Tree `{5,2,3}`:

              5
            /   \
           2     13

Return the root of new tree

             18
            /   \
          20     13

思路:

树的最右边一个节点的值不变,其双亲的值等于双亲的数值加上有右儿子的值,双亲的左儿子的值等于左儿子的值加上更新后的双亲的值,双亲的双亲等于双亲的双亲的值加上双亲的左儿子的值,依次类推可以将这棵树上的数值都更新一遍。最终的结果是最左边的结点的值等于最初所有节点的值的加和。运用递归的思想,一层一层的叠加。下面看一下具体的代码。

代码:

class Solution {
public:
    /**
     * @param root the root of binary tree
     * @return the new root
     */
    int sum=0;
    TreeNode* convertBST(TreeNode* root) {
        // Write your code here
       if(root==NULL) return NULL;
       convertBST(root->right);
       int t=root->val;
       root->val=sum+t;
       sum=sum+t;
       convertBST(root->left);
       return root;
     }
};

感想:

最开始看到这个题时的思路并不是上面代码的思路,我想先按照中序遍历的顺序存储整棵树的结点的值放到堆栈或者数组中。第一个数等于后面所有的值累加,第二个也是,然后再更新树上的值。这个想法比较简单但是实现起来还是非常复杂的。上面代码的思路并不是很常规也不是什么一定想不到的奇特思想,它递归的规则还是值得研究的。又一次体会到递归的魅力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值