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.
Example:
Input: The root of a Binary Search Tree like this: 5 / \ 2 13 Output: The root of a Greater Tree like this: 18 / \ 20 13
方法一:
class Solution {
public:
vector<int> vec;
int vi=0;
void DFS1(TreeNode* root){ //先中序遍历一遍,获取数组存在VEC
if(!root)return;
DFS1(root->left);
vec.push_back(root->val);
DFS1(root->right);
}
void DFS2(TreeNode* root){ //再遍历一遍,改变二叉树结点的值
if(!root)return;
DFS2(root->left);
root->val=vec[vi++];
DFS2(root->right);
}
TreeNode* convertBST(TreeNode* root) {
DFS1(root);
for(int i=vec.size()-2;i>=0;i--){ //求出大于等于某个结点其他结点值的和
vec[i]=vec[i]+vec[i+1];
}
DFS2(root);
return root;
}
};
方法二:
方法一AC后,我在想既然中序遍历是从小到大遍历二叉排序树,那么如果先递归右结点的话,那么不就是从大到小遍历了吗?这样用个变量保存结点相加的和,就可以只需要一次DFS就可以输出正确的结果了。
class Solution {
public:
int sum=0;
void DFS(TreeNode* root){
if(!root)return;
DFS(root->right);
sum+=root->val;
root->val=sum;
DFS(root->left);
}
TreeNode* convertBST(TreeNode* root) {
DFS(root);
return root;
}
};