常规:
两次中序遍历。
执行用时 : 88 ms, 在Convert BST to Greater Tree的C++提交中击败了39.07% 的用户
内存消耗 : 24 MB, 在Convert BST to Greater Tree的C++提交中击败了79.60% 的用户
/**
* 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:
vector<int> num;
int j;
TreeNode* convertBST(TreeNode* root) {
//两次中序遍历进行修改;
//第一次中序遍历,存入数组
midsrh(root);
//数组从后往前累加
int sz=num.size();
int t=0;
for(int i=sz-1;i>=0;i--)
{
num[i]+=t;
t=num[i];
}
//再一次中序遍历,修改二叉树
j=0;
midsrh2(root);
return root;
}
void midsrh(TreeNode* root)
{
if(root==NULL)
return;
midsrh(root->left);
num.push_back(root->val);
midsrh(root->right);
}
void midsrh2(TreeNode* root)
{
if(root==NULL)
return;
midsrh2(root->left);
root->val=num[j];
j++;
midsrh2(root->right);
}
};
改进:
一次中序遍历的逆过程:
执行用时 : 44 ms, 在Convert BST to Greater Tree的C++提交中击败了97.88% 的用户
内存消耗 : 23.5 MB, 在Convert BST to Greater Tree的C++提交中击败了85.57% 的用户
/**
* 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:
int t;
TreeNode* convertBST(TreeNode* root) {
t=0;
midsrh(root);
return root;
}
void midsrh(TreeNode* root)
{
if(root==NULL)
return;
midsrh(root->right);
root->val+=t;
t=root->val;
midsrh(root->left);
}
};