/* package whatever; // don't place package name! */
import java.util.* ;
import java.lang.* ;
/* Name of the class has to be "Main" only if the class is public. */
class BinarySearchTree {
this .value = value;
this .parent = parent;
}
int value;
}
if ( node == null )
return node;
if ( node.right != null ) {
return leftMostNode( node.right ) ;
}
while ( null != node.parent /* while we are not root */
&& node.parent .right == node) {
node = node.parent ; // go one level up
}
return node.parent ;
}
if ( null == node) {
return null ;
}
while ( null != node.left ) {
node = node.left ;
}
return node;
}
/** Search value in Tree need for Successor **/
while ( node != null
&& key != node.value ) {
if ( key < node.value ) {
node = node.left ;
} else if ( key > node.value ) {
node = node.right ;
}
}
return node;
}
/** Returns Successor of given value **/
public int getSuccessor( int val) {
if ( null == ( node = search( val) )
|| ( null == ( node = successor( node) ) ) ) {
// either val is not in BST, or it is the last value-> no
// successor
return - 1 ; // error_code for instance;
}
return node.value ;
}
public BinarySearchTree( int [ ] array) {
for ( int elem : array) {
add( elem) ;
}
}
public void add( int value) {
if ( mRoot == null ) {
} else {
insert( mRoot, value) ;
}
}
if ( node == null )
return ;
if ( value < node.value ) {
if ( node.left == null ) { // insert as the new left node
} else { // insert in the left subtree
insert( node.left , value) ;
}
} else { // value >= node.value
if ( node.right == null ) {
} else {
insert( node.right , value) ;
}
}
}
public static void main
( String [ ] args
) {
BinarySearchTree bst =
new BinarySearchTree( new int [ ] { 30 , 10 , 45 , 38 , 20 , 50 , 25 , 33 , 8 , 12 } ) ;
int value = 8 ; // first one
while ( value != - 1 ) {
System .
out .
println ( "next for " + value
+ " is " + ( value = bst.getSuccessor ( value) ) ) ;
}
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KICAgIGNsYXNzIEJpbmFyeVNlYXJjaFRyZWUgewogICAgICAgIFRyZWVOb2RlIG1Sb290ID0gbnVsbDsKCiAgICAgICAgc3RhdGljIHByaXZhdGUgY2xhc3MgVHJlZU5vZGUgewogICAgICAgICAgICBUcmVlTm9kZShpbnQgdmFsdWUsIFRyZWVOb2RlIHBhcmVudCkgewogICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRyZWVOb2RlIHBhcmVudCwgbGVmdCwgcmlnaHQ7CiAgICAgICAgICAgIGludCB2YWx1ZTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBUcmVlTm9kZSBzdWNjZXNzb3IoVHJlZU5vZGUgbm9kZSkgewogICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKQogICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7CgogICAgICAgICAgICBpZiAobm9kZS5yaWdodCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbGVmdE1vc3ROb2RlKG5vZGUucmlnaHQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB3aGlsZSAobnVsbCAhPSBub2RlLnBhcmVudCAvKiB3aGlsZSB3ZSBhcmUgbm90IHJvb3QgKi8KICAgICAgICAgICAgICAgICAgICAmJiBub2RlLnBhcmVudC5yaWdodCA9PSBub2RlKSB7CgogICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50OyAvLyBnbyBvbmUgbGV2ZWwgdXAKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG5vZGUucGFyZW50OwogICAgICAgIH0KCiAgICAgICAgcHVibGljIHN0YXRpYyBUcmVlTm9kZSBsZWZ0TW9zdE5vZGUoVHJlZU5vZGUgbm9kZSkgewogICAgICAgICAgICBpZiAobnVsbCA9PSBub2RlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgd2hpbGUgKG51bGwgIT0gbm9kZS5sZWZ0KSB7CiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5sZWZ0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBub2RlOwogICAgICAgIH0KCiAgICAgICAgLyoqIFNlYXJjaCB2YWx1ZSBpbiBUcmVlIG5lZWQgZm9yIFN1Y2Nlc3NvciAqKi8KICAgICAgICBwdWJsaWMgVHJlZU5vZGUgc2VhcmNoKGludCBrZXkpIHsKICAgICAgICAgICAgVHJlZU5vZGUgbm9kZSA9IG1Sb290OwogICAgICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsIAogICAgICAgICAgICAgICAgICAgICYmIGtleSAhPSBub2RlLnZhbHVlKSB7CgogICAgICAgICAgICAgICAgaWYgKGtleSA8IG5vZGUudmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5sZWZ0OwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPiBub2RlLnZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUucmlnaHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgICAgfQoKICAgICAgICAvKiogUmV0dXJucyBTdWNjZXNzb3Igb2YgZ2l2ZW4gdmFsdWUgKiovCiAgICAgICAgcHVibGljIGludCBnZXRTdWNjZXNzb3IoaW50IHZhbCkgewogICAgICAgICAgICBUcmVlTm9kZSBub2RlOwogICAgICAgICAgICBpZiAobnVsbCA9PSAobm9kZSA9IHNlYXJjaCh2YWwpKQogICAgICAgICAgICAgICAgICAgIHx8IChudWxsID09IChub2RlID0gc3VjY2Vzc29yKG5vZGUpKSkpIHsKICAgICAgICAgICAgICAgIC8vIGVpdGhlciB2YWwgaXMgbm90IGluIEJTVCwgb3IgaXQgaXMgdGhlIGxhc3QgdmFsdWUtPiBubwogICAgICAgICAgICAgICAgLy8gc3VjY2Vzc29yCiAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ly8gZXJyb3JfY29kZSBmb3IgaW5zdGFuY2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBub2RlLnZhbHVlOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIEJpbmFyeVNlYXJjaFRyZWUoaW50W10gYXJyYXkpIHsKICAgICAgICAgICAgZm9yIChpbnQgZWxlbSA6IGFycmF5KSB7CiAgICAgICAgICAgICAgICBhZGQoZWxlbSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHB1YmxpYyB2b2lkIGFkZChpbnQgdmFsdWUpIHsKICAgICAgICAgICAgaWYgKG1Sb290ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIG1Sb290ID0gbmV3IFRyZWVOb2RlKHZhbHVlLCBudWxsKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGluc2VydChtUm9vdCwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2b2lkIGluc2VydChUcmVlTm9kZSBub2RlLCBpbnQgdmFsdWUpIHsKICAgICAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgICAgIGlmICh2YWx1ZSA8IG5vZGUudmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChub2RlLmxlZnQgPT0gbnVsbCkgeyAvLyBpbnNlcnQgYXMgdGhlIG5ldyBsZWZ0IG5vZGUKICAgICAgICAgICAgICAgICAgICBub2RlLmxlZnQgPSBuZXcgVHJlZU5vZGUodmFsdWUsIG5vZGUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gaW5zZXJ0IGluIHRoZSBsZWZ0IHN1YnRyZWUKICAgICAgICAgICAgICAgICAgICBpbnNlcnQobm9kZS5sZWZ0LCB2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7IC8vIHZhbHVlID49IG5vZGUudmFsdWUKICAgICAgICAgICAgICAgIGlmIChub2RlLnJpZ2h0ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBub2RlLnJpZ2h0ID0gbmV3IFRyZWVOb2RlKHZhbHVlLCBub2RlKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0KG5vZGUucmlnaHQsIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CgogICAgICAgICAgICBCaW5hcnlTZWFyY2hUcmVlIGJzdCA9IAogICAgICAgICAgICAgICAgbmV3IEJpbmFyeVNlYXJjaFRyZWUobmV3IGludFtdezMwLCAxMCwgNDUsIDM4LCAyMCwgNTAsIDI1LCAzMywgOCwgMTJ9KTsKICAgICAgICAKICAgICAgICAgICAgaW50IHZhbHVlID0gODsgLy8gZmlyc3Qgb25lCiAgICAgICAgICAgIHdoaWxlICh2YWx1ZSAhPSAtMSkgewogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJuZXh0IGZvciAiICsgdmFsdWUgKyAiIGlzICIgKwogICAgICAgICAgICAgICAgICAgICh2YWx1ZSA9IGJzdC5nZXRTdWNjZXNzb3IodmFsdWUpKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAKICAgIA==