问题描述:
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.
样例:
Given a binary search Tree `{5,2,3}`:
5
/ \
2 13
Return the root of new tree
18
/ \
20 13
解题思路:
二叉排序树按中序遍历的先右后左得到的数组是从大到小的排列的,正好变换之后就是每一元素加上前面的元素的和。用了两次得中序遍历,第一次得到数组,处理后在重新更改二叉树。
代码:
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param root the root of binary tree
* @return the new root
*/
vector<int>tree;
void InorderTraversal(TreeNode *root) {
if (root== NULL)return ;
InorderTraversal(root->right);
tree.push_back(root->val);
InorderTraversal(root->left);
}
int k=0;
void InorderTraversal1(TreeNode *root) {
if (root== NULL)return ;
InorderTraversal1(root->right);
root->val=tree[k];k++;
InorderTraversal1(root->left);
}
TreeNode* convertBST(TreeNode* root) {
// Write your code here
InorderTraversal(root);
for(int i=1;i<tree.size();i++){
tree[i]=tree[i]+tree[i-1];
}
InorderTraversal1(root);
return root;
}
};
感想:
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param root the root of binary tree
* @return the new root
*/
vector<int>tree;
void InorderTraversal(TreeNode *root) {
if (root== NULL)return ;
InorderTraversal(root->right);
tree.push_back(root->val);
InorderTraversal(root->left);
}
int k=0;
void InorderTraversal1(TreeNode *root) {
if (root== NULL)return ;
InorderTraversal1(root->right);
root->val=tree[k];k++;
InorderTraversal1(root->left);
}
TreeNode* convertBST(TreeNode* root) {
// Write your code here
InorderTraversal(root);
for(int i=1;i<tree.size();i++){
tree[i]=tree[i]+tree[i-1];
}
InorderTraversal1(root);
return root;
}
};
方法虽然很简单但是时间效率太低了 需要两次遍历才能得到结果。