/*************************************************************
Following is the Binary Tree node structure
class TreeNode
{
public:
int data;
TreeNode *left, *right;
TreeNode() : data(0), left(NULL), right(NULL) {}
TreeNode(int x) : data(x), left(NULL), right(NULL) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : data(x), left(left), right(right) {}
};
*************************************************************/
TreeNode* insert_into_tree(TreeNode* &root, int key, bool &flag){
if(root == NULL && flag == 0){
TreeNode* temp = new TreeNode(key);
return temp;
}
if(root->data == key && flag == 0){
flag = 1;
return root;
}
if(root->data > key && flag == 0){
root->left = insert_into_tree(root->left, key, flag);
}
if(root->data < key && flag == 0){
root->right = insert_into_tree(root->right, key, flag);
}
return root; // forgot this before...!! (took too much time/ frustated me !! [ :( ]) (remember this from next time please...)
}
void inorder(TreeNode* root, vector<int> &v){
if(root == NULL){
return;
}
inorder(root->left, v);
v.push_back(root->data);
inorder(root->right, v);
}
int binary_search(int key, vector<int> &v){
int s = 0, e = v.size()-1;
int mid = s + (e-s)/2;
while(s <= e){
if(v[mid] == key){
return mid;
}
else if(v[mid] < key){
s = mid+1;
}
else{ // v[mid] > key
e = mid-1;
}
mid = s + (e-s)/2;
}
return -1;
}
pair<int, int> predecessorSuccessor(TreeNode *root, int key)
{
// Write your code here.
bool flag = 0;
insert_into_tree(root, key, flag);
vector<int> v; // will be sorted
inorder(root, v);
int index = binary_search(key, v);
pair<int, int> p;
if(v.size() == 1){
p.first = -1;
p.second = -1;
}
else if(index == 0 && v.size() > 1){
p.first = -1;
p.second = v[1];
}
else if(index == v.size()-1 && v.size() > 1){
p.first = v[v.size()-2];
p.second = -1;
}
else{
p.first = v[index-1];
p.second = v[index+1];
}
return p;
}