给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。
例如:
输入: 二叉搜索树: 5 / \ 2 13 输出: 转换为累加树: 18 / \ 20 13
题目其实考的就是BST中序对应的逆序遍历,先访问右子树,然后父节点,最后左子树,并在访问过程中记录已访问的节点总和,累加到当前的节点上。
/**
* 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:
void dfs(TreeNode *root, int &sum) {
if (root->right)
dfs(root->right, sum);
root->val += sum;
sum = root->val;
if (root->left)
dfs(root->left, sum);
}
TreeNode* convertBST(TreeNode* root) {
if (root) {
int sum = 0;
dfs(root, sum);
}
return root;
}
};