/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
class BinarySearchTree {
public Node root;
static class Node
{
int data;
Node right;
Node left;
public Node(int data)
{
this.data=data;
this.right=null;
this.left=null;
}
}
public void insert(int data)
{
root=treeInsert(root,data);
}
public Node treeInsert(Node root,int data)
{
if(root==null)
{
root=new Node(data);
return root;
}
if(data >= root.data)
root.right= treeInsert(root.right,data);
else
root.left= treeInsert(root.left,data);
return root;
}
public static void main
(String[] args
) { // TODO Auto-generated method stub
BinarySearchTree tree = new BinarySearchTree();
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80 */
tree.insert(50);
tree.insert(30);
tree.insert(20);
tree.insert(40);
tree.insert(70);
tree.insert(60);
tree.insert(80);
System.
out.
println("successor :"+tree.
inOrderSuccessor(45)); System.
out.
println("successor :"+tree.
inOrderSuccessor(55));
}
private int inOrderSuccessor(int i) {
Node successor=recursiveInOrderSuccessor(root,i);
if(successor!=null)
return successor.data;
else
return -1;
}
private Node recursiveInOrderSuccessor(Node root2,int i) {
if(root2 == null) return null;
Node successor = null, succ2 = null;
if(root2.data == i) {
successor = root2.right;
while(successor.left != null){
successor = successor.left;
}
return successor;
}
if(root2.data > i){
successor = root2;
succ2 = recursiveInOrderSuccessor(root2.left, i);
if(succ2 != null && succ2.data < successor.data)
return succ2;
else
return successor;
}
else{
return recursiveInOrderSuccessor(root2.right, i);
}
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgpjbGFzcyBCaW5hcnlTZWFyY2hUcmVlIHsKcHVibGljIE5vZGUgcm9vdDsKc3RhdGljIGNsYXNzIE5vZGUKewogICAgaW50IGRhdGE7CiAgICBOb2RlIHJpZ2h0OwogICAgTm9kZSBsZWZ0OwoKICAgIHB1YmxpYyBOb2RlKGludCBkYXRhKQogICAgewogICAgICAgIHRoaXMuZGF0YT1kYXRhOwogICAgICAgIHRoaXMucmlnaHQ9bnVsbDsKICAgICAgICB0aGlzLmxlZnQ9bnVsbDsKICAgIH0KfQoKcHVibGljIHZvaWQgaW5zZXJ0KGludCBkYXRhKQp7ICAgCiAgICByb290PXRyZWVJbnNlcnQocm9vdCxkYXRhKTsgICAgIAp9CgpwdWJsaWMgTm9kZSB0cmVlSW5zZXJ0KE5vZGUgcm9vdCxpbnQgZGF0YSkKewogICAgaWYocm9vdD09bnVsbCkKICAgICAgICB7CiAgICAgICAgcm9vdD1uZXcgTm9kZShkYXRhKTsgICAgICAgICAgICAKICAgICAgICByZXR1cm4gcm9vdDsKICAgICAgICB9CgogICAgaWYoZGF0YSA+PSByb290LmRhdGEpCiAgICAgICAgcm9vdC5yaWdodD0gdHJlZUluc2VydChyb290LnJpZ2h0LGRhdGEpOwogICAgZWxzZSAKICAgICAgICByb290LmxlZnQ9IHRyZWVJbnNlcnQocm9vdC5sZWZ0LGRhdGEpOwoKICAgIHJldHVybiByb290Owp9CgoKCnB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKCiAgICBCaW5hcnlTZWFyY2hUcmVlIHRyZWUgPSBuZXcgQmluYXJ5U2VhcmNoVHJlZSgpOwoKICAgIC8qIExldCB1cyBjcmVhdGUgZm9sbG93aW5nIEJTVAogICAgICAgICAgNTAKICAgICAgIC8gICAgIFwKICAgICAgMzAgICAgICA3MAogICAgIC8gIFwgICAgLyAgXAogICAyMCAgIDQwICA2MCAgIDgwICovCiAgICB0cmVlLmluc2VydCg1MCk7CiAgICB0cmVlLmluc2VydCgzMCk7CiAgICB0cmVlLmluc2VydCgyMCk7CiAgICB0cmVlLmluc2VydCg0MCk7CiAgICB0cmVlLmluc2VydCg3MCk7CiAgICB0cmVlLmluc2VydCg2MCk7CiAgICB0cmVlLmluc2VydCg4MCk7CiAgICBTeXN0ZW0ub3V0LnByaW50bG4oInN1Y2Nlc3NvciA6Iit0cmVlLmluT3JkZXJTdWNjZXNzb3IoNDUpKTsgICAgCiAgICBTeXN0ZW0ub3V0LnByaW50bG4oInN1Y2Nlc3NvciA6Iit0cmVlLmluT3JkZXJTdWNjZXNzb3IoNTUpKTsKCn0KCnByaXZhdGUgaW50IGluT3JkZXJTdWNjZXNzb3IoaW50IGkpIHsKCiAgICBOb2RlIHN1Y2Nlc3Nvcj1yZWN1cnNpdmVJbk9yZGVyU3VjY2Vzc29yKHJvb3QsaSk7CiAgICBpZihzdWNjZXNzb3IhPW51bGwpCiAgICByZXR1cm4gc3VjY2Vzc29yLmRhdGE7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOyAgICAgIAp9Cgpwcml2YXRlIE5vZGUgcmVjdXJzaXZlSW5PcmRlclN1Y2Nlc3NvcihOb2RlIHJvb3QyLGludCBpKSB7CiAgICBpZihyb290MiA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIE5vZGUgc3VjY2Vzc29yID0gbnVsbCwgc3VjYzIgPSBudWxsOwogICAgaWYocm9vdDIuZGF0YSA9PSBpKSB7CiAgICAgICAgc3VjY2Vzc29yID0gcm9vdDIucmlnaHQ7CiAgICAgICAgd2hpbGUoc3VjY2Vzc29yLmxlZnQgIT0gbnVsbCl7CiAgICAgICAgICAgIHN1Y2Nlc3NvciA9IHN1Y2Nlc3Nvci5sZWZ0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3VjY2Vzc29yOwogICAgfQogICAgCiAgICBpZihyb290Mi5kYXRhID4gaSl7CiAgICAgICAgc3VjY2Vzc29yID0gcm9vdDI7CiAgICAgICAgc3VjYzIgPSByZWN1cnNpdmVJbk9yZGVyU3VjY2Vzc29yKHJvb3QyLmxlZnQsIGkpOwogICAgICAgIGlmKHN1Y2MyICE9IG51bGwgJiYgc3VjYzIuZGF0YSA8IHN1Y2Nlc3Nvci5kYXRhKQogICAgICAgICAgICByZXR1cm4gc3VjYzI7CiAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4gc3VjY2Vzc29yOwogICAgfQogICAgZWxzZXsKICAgICAgICByZXR1cm4gcmVjdXJzaXZlSW5PcmRlclN1Y2Nlc3Nvcihyb290Mi5yaWdodCwgaSk7CiAgICB9Cn0KCn0=