题目分析:
其实只要看到BST就应该立马想到它的一个重要的性质:其中序遍历序列是非递减的。因此本题目的思路就是:先求树中所有结点值的和sum,然后中序遍历BST,用sum代替之前的结点值,然后更新sum。
请看下面的代码:
class Solution {
public:
void inorder(TreeNode*root,int &sum){ //中序遍历,将BST转化为累加树,因为sum的值需要不断的变化,因此使用引用
if(root==NULL){
return;
}
inorder(root->left,sum); //递归中序遍历左子树
int temp=root->val; //先保留该节点的值
root->val=sum; //更新该节点的值为sum
sum-=temp; //更新sum的值,减去之前保留的结点的值
inorder(root->right,sum); //递归中序遍历右子树。
}
void inorderSum(TreeNode*root,int &sum){ //中序遍历对BST求和,sum要使用引用的方式
if(root==NULL){
return;
}
inorderSum(root->left,sum);
sum+=root->val;
inorderSum(root->right,sum);
}
TreeNode* convertBST(TreeNode* root) {
int sum=0;
inorderSum(root,sum); //调用函数
inorder(root,sum);
return root;
}
};