12. Binary Search Tree to Greater Sum Tree / Greater Tree
Given the root
of 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.
As a reminder, a binary search tree is a tree that satisfies these constraints:
The left subtree of a node contains only nodes with keys less than the node's key.
The right subtree of a node contains only nodes with keys greater than the node's key.
Both the left and right subtrees must also be binary search trees.
Example 1:
Input: root = [4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
Output: [30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]
Example 2:
Input: root = [0,null,1]
Output: [1,null,1]
Example 3:
Input: root = [1,0,2]
Output: [3,3,2]
Example 4:
Input: root = [3,2,4,1]
Output: [7,9,4,10]
Solution:
Bruteforce solution is using two traversal 1 traversing and 1 checking nodes which are greater O(n^2)
Solution I: (Using inorder traversal and sorted array)
Approach: Inorder Traversal gives sorted array Making prefix sum form right to left Again doing inorder traversal and inserting values
class Solution
{
public:
TreeNode *bstToGst(TreeNode *root)
{
vector<int> v;
stack<TreeNode *> s;
TreeNode *t = root;
while (!s.empty() || t != NULL)
{
if (t != NULL)
{
s.push(t);
t = t->left;
}
else
{
t = s.top();
s.pop();
v.push_back(t->val);
t = t->right;
}
}
for (int i = v.size() - 2; i >= 0; i--)
{
v[i] = v[i + 1] + v[i];
}
int i = 0;
stack<TreeNode *> st;
t = root;
while (!st.empty() || t != NULL)
{
if (t != NULL)
{
st.push(t);
t = t->left;
}
else
{
t = st.top();
st.pop();
t->val = v[i];
i++;
t = t->right;
}
}
return root;
}
};
Time Complexity: O(N) Space Complexity: O(n)
Solution II: (Reverse Inorder)
class Solution
{
public:
TreeNode *convertBST(TreeNode *root)
{
TreeNode *t = root;
stack<TreeNode *> s;
int sum = 0;
while (!s.empty() || t != NULL)
{
if (t != NULL)
{
s.push(t);
t = t->right;
}
else
{
t = s.top();
sum += t->val;
t->val = sum;
s.pop();
t = t->left;
}
}
return root;
}
};
Time Complexity: O(N) Space Complexity: O(n)
Last updated
Was this helpful?