/**********************************************************************
Binary Search Tree
**********************************************************************/
class Node{
public String word;
public Node left;
public Node right;
public Node(String someWord ){
word=new String(someWord);
left=null;
right=null;
}
}
class BinTree{
private Node root;
private Node curNode, prevNode;
private void inorder(Node curRoot){
if (curRoot!=null){
inorder(curRoot.left);
System.out.println(curRoot.word);
inorder(curRoot.right);
}
}
private Node find(String someWord){
prevNode=root;
curNode=root;
while(curNode!=null){
if (someWord.compareTo(curNode.word)==0)
break;
prevNode=curNode;
if (someWord.compareTo(curNode.word) < 0)
curNode=curNode.left;
else curNode=curNode.right;
}
return curNode;
}
private Node findPred(Node someNode){
prevNode=someNode;
if (someNode.left==null) return null;
curNode=someNode.left;
while(curNode.right!=null){
prevNode=curNode;
curNode=curNode.right;
}
return curNode;
}
public BinTree(){
root=null;
}
public void display(){
System.out.println("---------------");
inorder(root);
System.out.println("---------------");
}
public int insert(String someWord){
// word already in tree:
if(find(someWord)!=null) return -1;
Node newNode=new Node(someWord);
// tree was empty, and word is the first:
if (root==null){
root=newNode;
return 1;
}
// word has to be inserted sometime after the root:
curNode=root;
prevNode=root;
while(curNode!=null){
prevNode=curNode;
if (someWord.compareTo(curNode.word)<0)
curNode=curNode.left;
else curNode=curNode.right;
}
if (someWord.compareTo(prevNode.word)<0)
prevNode.left=newNode;
else prevNode.right=newNode;
return 1;
}
public int delete(String someWord){
Node nodeToDelete=find(someWord);
Node nodesParent=prevNode;
// word not found:
if (nodeToDelete==null) return -1;
// word found in root node:
if (nodeToDelete==root) {
// root node with no children:
if ((root.left==null)&&(root.right==null)){
root=null;
return 1;
}
// root node with one child:
if ((root.left!=null)&&(root.right==null)){
root=root.left;
return 1;
}
if ((root.left==null)&&(root.right!=null)){
root=root.right;
return 1;
}
// root node with two children:
if ((root.left!=null)&&(root.right!=null)){
Node pred=findPred(nodeToDelete);
Node predsParent=prevNode;
// relinking predecessor's parent:
if (predsParent.left==pred)
predsParent.left=pred.left;
else predsParent.right=pred.left;
root.word=new String(pred.word);
// actually, the pred node is delinked
return 1;
}
}
// word found in a leaf node:
if ((nodeToDelete.left==null)&&
(nodeToDelete.right==null)){
if (nodesParent.left==nodeToDelete)
nodesParent.left=null;
else nodesParent.right=null;
return 1;
}
// word found in node with only one child:
if ((nodeToDelete.left!=null)&&
(nodeToDelete.right==null)) {
if (nodesParent.left==nodeToDelete)
nodesParent.left=nodeToDelete.left;
else nodesParent.right=nodeToDelete.left;
return 1;
}
if ((nodeToDelete.left==null)&&
(nodeToDelete.right!=null)) {
if (nodesParent.left==nodeToDelete)
nodesParent.left=nodeToDelete.right;
else nodesParent.right=nodeToDelete.right;
return 1;
}
// word found in node with 2 children:
if ((nodeToDelete.left!=null)&&
(nodeToDelete.right!=null)){
Node pred=findPred(nodeToDelete);
Node predsParent=prevNode;
// relinking predecessor's parent:
if (predsParent.left==pred)
predsParent.left=pred.left;
else predsParent.right=pred.left;
nodeToDelete.word=new String(pred.word);
// actually,the pred node is delinked
return 1;
}
return 0;
}
/* Test tools:
private Node node1,node2,node11,node21,node22,node212;
public void genTree(){
root=new Node("jokes");
node1=new Node("improperly");
node2=new Node("told");
node11=new Node("get");
node21=new Node("often");
node22=new Node("uncomfortable");
node212=new Node("silences");
root.left=node1;
root.right=node2;
node1.left=node11;
node2.left=node21;
node2.right=node22;
node21.right=node212;
}
*/
}
class BinTreeAp {
public static void main(String args[]){
BinTree BT=new BinTree();
BT.insert("hello");
BT.insert("there");
BT.insert("this");
BT.insert("is");
BT.insert("a");
BT.insert("test");
BT.insert("for");
BT.insert("a");
BT.insert("binary");
BT.insert("search");
BT.insert("tree");
BT.display();
BT.delete("hello");
BT.delete("there");
BT.display();
}
}