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