/**
*
* @author sunnyykn
*/
importjava.io.*;
importjava.util.*;
classNode
{
publicintiData;//data item (key)
publicdoubledData;//data item
publicNode leftChild;//this node's left child
publicNode rightChild;//this node's right child
publicvoiddisplayNode()//display ourself
{
System.out.print("{");
System.out.print(iData);
System.out.print(",");
System.out.print(dData);
System.out.print("}");
}
}//end class Node
classTree
{
privateNode root;//first node of tree
publicTree()
{
root = null;//no nodes in tree yet
}
publicNode find(intkey)//find node with given key
{
Node current = root; //start at root
while(current.iData != key)//while no match
{
if(key
current = current.leftChild;
else//go right?
current = current.rightChild;
if(current ==null)//didn't find it
returnnull;
}
returncurrent;
}//end find()
publicvoidinsert(intid ,doubledd)
{
Node newNode = newNode();//make new node
newNode.iData = id; //insert data
newNode.dData = dd;
if( root ==null)//no node in root
root = newNode;
else
{
Node current = root; //start at root
Node parent;
while(true)
{
parent = current;
if(id
{
current = current.leftChild;
if(current ==null)//if end of the line
{
parent.leftChild = newNode;
return;
}
}//end if go left
else//or go right
{
current = current.rightChild;
if(current ==null)//if end of the line
{
parent.rightChild = newNode;
return;
}
}//end else go right
}//end while
}//end else not root
}//end insert()
publicbooleandelete(intkey)//delete node with given key
{
Node current = root;
Node parent = root;
booleanisLeftChild =true;
while(current.iData != key)
{
parent = current;
if(key
{
isLeftChild = true;
current = current.leftChild;
}
else
{
isLeftChild = false;
current = current.rightChild;
}
if(current ==null)
returnfalse;
}//end while
//found node to delete
//if no children , simply delete it
if(current.leftChild ==null&& current.rightChild ==null)
{
if(current == root)
root = null;
elseif(isLeftChild)
parent.leftChild = null;
else
parent.rightChild = null;
}
//if no right child , replace with left subtree
elseif(current.rightChild ==null)
{
if(current == root)
root = current.leftChild;
elseif(isLeftChild)
parent.leftChild = current.leftChild;
else
parent.rightChild = current.leftChild;
}
//if no left child , replace with right subtree
elseif(current.leftChild ==null)
{
if(current == root)
root = current.rightChild;
elseif(isLeftChild)
parent.leftChild = current.rightChild;
else
parent.rightChild = current.rightChild;
}
//two children,so replace with inorder successor
else
{
//get successor of node to delete(current)
Node successor = getSuccessor(current);
//connect parent of current to successor insteed
if(current == root)
root = successor;
elseif(isLeftChild)
parent.leftChild = successor;
else
parent.rightChild = successor;
//connect successor to current's left child
successor.leftChild = current.leftChild;
}//end else two children
//(successor cannot have a left child)
returntrue;
}//end delete()
//return node with next-highest value after delNode
//goes to right child , then right child's left descendents
privateNode getSuccessor(Node delNode)
{
Node successorParent = delNode;
Node successor = delNode;
Node current = delNode.rightChild; //go to right child
while(current !=null)//until no more left children
{
successorParent = successor;
successor = current;
current = current.leftChild; //go to left child
}
if(successor != delNode.rightChild)//if successor not right child , make connections
{
successorParent.leftChild = successor.rightChild;
successor.rightChild = delNode.rightChild;
}
returnsuccessor;
}
publicvoidtraverse(inttraverseType)
{
switch(traverseType)
{
case1:
System.out.print("/nPreorder traversal:");
preOrder(root);
break;
case2:
System.out.print("/nInorder traversal: ");
inOrder(root);
break;
case3:
System.out.print("/nPostorder traversal:");
postOrder(root);
break;
}
System.out.println("");
}
privatevoidpreOrder(Node localRoot)
{
if(localRoot !=null)
{
System.out.print(localRoot.iData + " ");
preOrder(localRoot.leftChild);
preOrder(localRoot.rightChild);
}
}
privatevoidinOrder(Node localRoot)
{
if(localRoot !=null)
{
inOrder(localRoot.leftChild);
System.out.print(localRoot.iData + " ");
inOrder(localRoot.rightChild);
}
}
privatevoidpostOrder(Node localRoot)
{
if(localRoot !=null)
{
postOrder(localRoot.leftChild);
postOrder(localRoot.rightChild);
System.out.print(localRoot.iData + " ");
}
}
publicvoiddisplayTree()
{
Stack globalStack = newStack();
globalStack.push(root);
intnBlanks =32;
booleanisRowEmpty =false;
System.out.println("....................................................");
while(isRowEmpty ==false)
{
Stack localStack = newStack();
isRowEmpty = true;
for(intj =0;j
System.out.print(" ");
while(globalStack.isEmpty() ==false)
{
Node temp = (Node)globalStack.pop();
if(temp !=null)
{
System.out.print(temp.iData);
localStack.push(temp.leftChild);
localStack.push(temp.rightChild);
if(temp.leftChild !=null|| temp.rightChild !=null)
isRowEmpty = false;
}
else
{
System.out.print("--");
localStack.push(null);
localStack.push(null);
}
for(intj =0; j
System.out.print(" ");
}//end while globalStack not empty
System.out.println("");
nBlanks /= 2;
while(localStack.isEmpty() ==false)
globalStack.push( localStack.pop() );
}//end while isRowEmpty is false
System.out.println("....................................................");
}//end displayTree()
}//end class Tree
classTreeApp
{
publicstaticvoidmain(String[] args)throwsIOException
{
intvalue ;
Tree theTree = newTree();
theTree.insert(50,1.5);
theTree.insert(25,1.2);
theTree.insert(75,1.7);
theTree.insert(12,1.5);
theTree.insert(37,1.2);
theTree.insert(43,1.7);
theTree.insert(30,1.5);
theTree.insert(33,1.2);
theTree.insert(87,1.7);
theTree.insert(93,1.5);
theTree.insert(97,1.5);
while(true)
{
System.out.print("Enter first letter of show,insert,find,delete,or traverse:");
intchoice = getChar();
switch( choice )
{
case's':
theTree.displayTree();
break;
case'i':
System.out.print("Enter value to insert:");
value = getInt();
theTree.insert(value, value + 0.9);
break;
case'f':
System.out.print("Enter value to find:");
value = getInt();
Node found = theTree.find(value);
if(found !=null)
{
System.out.print("Found:");
found.displayNode();
System.out.print("/n");
}
else
{
System.out.print("Could not find ");
System.out.print(value + '/n');
}
break;
case'd':
System.out.print("Enter value to delete:");
value = getInt();
booleandidDelete = theTree.delete(value);
if(didDelete)
System.out.print("Deleted "+ value +'/n');
else{
System.out.print("Could not delete ");
System.out.print(value + '/n');
}
break;
case't':
System.out.print("Enter type 1,2 or 3:");
value = getInt();
theTree.traverse(value);
break;
default:
System.out.print("Invalid entry/n");
}//end switch
}//end while
}//end main()
publicstaticString getString()throwsIOException
{
InputStreamReader isr = newInputStreamReader(System.in);
BufferedReader br = newBufferedReader(isr);
String s = br.readLine();
returns;
}
publicstaticchargetChar()throwsIOException
{
String s = getString();
returns.charAt(0);
}
publicstaticintgetInt()throwsIOException
{
String s = getString();
returnInteger.parseInt(s);
}
}//end class TreeApp