/**
* 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 {
public:
TreeNode* convertBST(TreeNode* root) {
int rootOriginSum, rootNewSum;
convertNode(root, rootOriginSum, 0, rootNewSum);
return root;
}
void convertNode(TreeNode* node, int& originSum, int delta, int& newSum) {
if (!node) {
originSum = 0;
newSum = 0;
return;
}
int rightOriginSum, rightNewSum;
convertNode(node->right, rightOriginSum, delta, rightNewSum);
int leftOriginSum, leftNewSum;
convertNode(node->left, leftOriginSum, delta + node->val + rightOriginSum, leftNewSum);
originSum = node->val + leftOriginSum + rightOriginSum;
node->val += delta + rightOriginSum;
newSum = node->val + leftNewSum + rightNewSum;
}
};