/** */
/**
* tree.java
* demonstrates binary tree
* to run this program: c>java TreeApp
*/
import java.io. * ;
import java.util. * ; // for Stack class
/
class Node
... {
public int iData ; //data item (key)
public double dData; //data item
public Node leftChild; //this node's left child
public Node rightChild; //this node's right child
public void displayNode() //display ourself
...{
System.out.print("{");
System.out.print(iData);
System.out.print(", ");
System.out.print(dData);
System.out.print("}");
}
} // end class Node
// /
class Tree
... {
private Node root; //first node of tree
//.......................................................................
public Tree() //constructor
...{
root = null ; //no nodes in tree yet
}
//.......................................................................
public Node find(int key) //find node with given key
...{ //(assumes not-empty tree)
Node current = root; //start at root
while(current.iData != key) //while no match,
...{
if( key < current.iData) //go left ?
current = current.leftChild;
else //or go right?
current = current.rightChild;
if( current == null ) // if no child,
return null; //didn't find it
}
return current; //found it
}//end find()
//.......................................................................
public void insert(int id,double dd)
...{
Node newNode = new Node(); //make new node
newNode.iData = id; //insert data
newNode.dData = dd;
if( root == null ) //no node in root
root = newNode;
else //root occupied
...{
Node current = root; //start at root
Node parent;
while(true) //(exits internally)
...{
parent = current;
if( id < current.iData ) //go left?
...{
current = current.leftChild;
if( current == null ) //if end of the line
...{ //insert on left
parent.leftChild = newNode;
return;
}
}//end if go left
else //or go right?
...{
current = current.rightChild;
if( current == null ) //if end of the line
...{ //insert on right
parent.rightChild = newNode;
return;
}
}//end else go right
}//end while
}//end else on root
}//end insert()
//.......................................................................
public boolean delete( int key ) //delete node with given key
...{
Node current = root;
Node parent = root;
boolean isLeftChild = true;
while( current.iData != key ) //search for node
...{
parent = current;
if( key < current.iData ) //go left ?
...{
isLeftChild = true;
current = current.leftChild;
}
else //or go right?
...{
isLeftChild = false;
current = current.rightChild;
}
if( current == null ) //end of the line,
return false; //didn't find it
}//end while
//found node to delete
// if no children,simply delete it
if( current.leftChild==null && current.rightChild==null)
...{
if( current == root ) //if root;
root = null; //tree is empty
else if( isLeftChild )
parent.leftChild = null; //disconnect from parent
else
parent.rightChild = null;
}
//if no right child,replace with left subtree
else if ( current.rightChild== null )
...{
if( current == root )
root = current.leftChild;
else if( isLeftChild )
parent.leftChild = current.leftChild;
else
parent.rightChild = current.leftChild;
}
//if no left child, replace with right subtree
else if( current.leftChild== null )
...{
if( current == root )
root = current.rightChild;
else if( 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 instead
if( current == root)
root = successor;
else if( isLeftChild )
parent.leftChild = successor;
else
parent.rightChild = successor;
//connect successor to current's left child
successor.leftChild = current.leftChild;
}//end else two children
//(successor can't have a left child)
return true; //success
}//end delete();
//.......................................................................
//returns node with next-highest value after delNode
//goes to right child,then right child's left descendents
private Node 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 leftChild
}
if( successor != delNode.rightChild ) //if successor not right child make connections
...{
successorParent.leftChild = successor.rightChild;
successor.rightChild = delNode.rightChild;
}
return successor;
}//end getSuccessor()
//.......................................................................
public void traverse( int traverseType)
...{
switch(traverseType)
...{
case 1: System.out.print(" Preorder traversal: ");
preOrder(root);
break;
case 2: System.out.print(" Inorder traversal: ");
inOrder(root);
break;
case 3: System.out.print(" Postorder traversal: ");
postOrder(root);
break;
}
System.out.println();
}//end traverse();
//.......................................................................
private void preOrder(Node localRoot)
...{
if( localRoot != null)
...{
System.out.print(localRoot.iData + " ");
preOrder(localRoot.leftChild);
preOrder(localRoot.rightChild);
}
}//end preOrder();
//.......................................................................
private void inOrder(Node localRoot)
...{
if( localRoot != null)
...{
inOrder(localRoot.leftChild);
System.out.print(localRoot.iData + " ");
inOrder(localRoot.rightChild);
}
}//end inOrder();
//.......................................................................
private void postOrder(Node localRoot)
...{
if( localRoot != null )
...{
postOrder(localRoot.leftChild);
postOrder(localRoot.rightChild);
System.out.print(localRoot.iData + " ");
}
}//end postOrder();
//.......................................................................
public void displayTree()
...{
Stack globalStack = new Stack();
globalStack.push(root);
int nBlanks = 32;
boolean isRowEmpty = false;
System.out.println("....................................................................");
while(isRowEmpty == false )
...{
Stack localStack = new Stack();
isRowEmpty = true;
for(int j=0; j<nBlanks; 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(int j=0; j<nBlanks*2-2; j++)
System.out.print(" ");
}//end while globalStack not empty
System.out.println();
nBlanks /= 2;
while(localStack.isEmpty() == false)
globalStack.push( localStack.pop() );
}//end while is RowEmpty is false
System.out.println("......................................................................");
}//end dispalyTree();
//.......................................................................
} // end class Tree
// /
class TreeApp
... {
public static void main(String[] args) throws IOException
...{
int value;
Tree theTree = new Tree();
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, ");
System.out.print("insert, find, delete, or traverse: ");
int choice = 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(" ");
}
else
System.out.println("Cound not find value " + ' ');
break;
case 'd': System.out.print("Enter value to delete: ");
value = getInt();
boolean didDelete = theTree.delete(value);
if( didDelete )
System.out.print("Deleted "+ value+' ');
else
System.out.print("Cound not delete value " + ' ');
break;
case 't': System.out.print("Enter type 1,2 or 3: ");
value = getInt();
theTree.traverse(value);
break;
default:
System.out.print("Invalid entry ");
}//end switch
}//end while
}//end main()
//...............................................................................
public static String getString() throws IOException
...{
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String s= br.readLine();
return s;
}
//...............................................................................
public static char getChar() throws IOException
...{
String s = getString();
return s.charAt(0);
}
//...............................................................................
public static int getInt() throws IOException
...{
String s = getString();
return Integer.parseInt(s);
}
//...............................................................................
} // end class TreeApp
// /
* tree.java
* demonstrates binary tree
* to run this program: c>java TreeApp
*/
import java.io. * ;
import java.util. * ; // for Stack class
/
class Node
... {
public int iData ; //data item (key)
public double dData; //data item
public Node leftChild; //this node's left child
public Node rightChild; //this node's right child
public void displayNode() //display ourself
...{
System.out.print("{");
System.out.print(iData);
System.out.print(", ");
System.out.print(dData);
System.out.print("}");
}
} // end class Node
// /
class Tree
... {
private Node root; //first node of tree
//.......................................................................
public Tree() //constructor
...{
root = null ; //no nodes in tree yet
}
//.......................................................................
public Node find(int key) //find node with given key
...{ //(assumes not-empty tree)
Node current = root; //start at root
while(current.iData != key) //while no match,
...{
if( key < current.iData) //go left ?
current = current.leftChild;
else //or go right?
current = current.rightChild;
if( current == null ) // if no child,
return null; //didn't find it
}
return current; //found it
}//end find()
//.......................................................................
public void insert(int id,double dd)
...{
Node newNode = new Node(); //make new node
newNode.iData = id; //insert data
newNode.dData = dd;
if( root == null ) //no node in root
root = newNode;
else //root occupied
...{
Node current = root; //start at root
Node parent;
while(true) //(exits internally)
...{
parent = current;
if( id < current.iData ) //go left?
...{
current = current.leftChild;
if( current == null ) //if end of the line
...{ //insert on left
parent.leftChild = newNode;
return;
}
}//end if go left
else //or go right?
...{
current = current.rightChild;
if( current == null ) //if end of the line
...{ //insert on right
parent.rightChild = newNode;
return;
}
}//end else go right
}//end while
}//end else on root
}//end insert()
//.......................................................................
public boolean delete( int key ) //delete node with given key
...{
Node current = root;
Node parent = root;
boolean isLeftChild = true;
while( current.iData != key ) //search for node
...{
parent = current;
if( key < current.iData ) //go left ?
...{
isLeftChild = true;
current = current.leftChild;
}
else //or go right?
...{
isLeftChild = false;
current = current.rightChild;
}
if( current == null ) //end of the line,
return false; //didn't find it
}//end while
//found node to delete
// if no children,simply delete it
if( current.leftChild==null && current.rightChild==null)
...{
if( current == root ) //if root;
root = null; //tree is empty
else if( isLeftChild )
parent.leftChild = null; //disconnect from parent
else
parent.rightChild = null;
}
//if no right child,replace with left subtree
else if ( current.rightChild== null )
...{
if( current == root )
root = current.leftChild;
else if( isLeftChild )
parent.leftChild = current.leftChild;
else
parent.rightChild = current.leftChild;
}
//if no left child, replace with right subtree
else if( current.leftChild== null )
...{
if( current == root )
root = current.rightChild;
else if( 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 instead
if( current == root)
root = successor;
else if( isLeftChild )
parent.leftChild = successor;
else
parent.rightChild = successor;
//connect successor to current's left child
successor.leftChild = current.leftChild;
}//end else two children
//(successor can't have a left child)
return true; //success
}//end delete();
//.......................................................................
//returns node with next-highest value after delNode
//goes to right child,then right child's left descendents
private Node 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 leftChild
}
if( successor != delNode.rightChild ) //if successor not right child make connections
...{
successorParent.leftChild = successor.rightChild;
successor.rightChild = delNode.rightChild;
}
return successor;
}//end getSuccessor()
//.......................................................................
public void traverse( int traverseType)
...{
switch(traverseType)
...{
case 1: System.out.print(" Preorder traversal: ");
preOrder(root);
break;
case 2: System.out.print(" Inorder traversal: ");
inOrder(root);
break;
case 3: System.out.print(" Postorder traversal: ");
postOrder(root);
break;
}
System.out.println();
}//end traverse();
//.......................................................................
private void preOrder(Node localRoot)
...{
if( localRoot != null)
...{
System.out.print(localRoot.iData + " ");
preOrder(localRoot.leftChild);
preOrder(localRoot.rightChild);
}
}//end preOrder();
//.......................................................................
private void inOrder(Node localRoot)
...{
if( localRoot != null)
...{
inOrder(localRoot.leftChild);
System.out.print(localRoot.iData + " ");
inOrder(localRoot.rightChild);
}
}//end inOrder();
//.......................................................................
private void postOrder(Node localRoot)
...{
if( localRoot != null )
...{
postOrder(localRoot.leftChild);
postOrder(localRoot.rightChild);
System.out.print(localRoot.iData + " ");
}
}//end postOrder();
//.......................................................................
public void displayTree()
...{
Stack globalStack = new Stack();
globalStack.push(root);
int nBlanks = 32;
boolean isRowEmpty = false;
System.out.println("....................................................................");
while(isRowEmpty == false )
...{
Stack localStack = new Stack();
isRowEmpty = true;
for(int j=0; j<nBlanks; 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(int j=0; j<nBlanks*2-2; j++)
System.out.print(" ");
}//end while globalStack not empty
System.out.println();
nBlanks /= 2;
while(localStack.isEmpty() == false)
globalStack.push( localStack.pop() );
}//end while is RowEmpty is false
System.out.println("......................................................................");
}//end dispalyTree();
//.......................................................................
} // end class Tree
// /
class TreeApp
... {
public static void main(String[] args) throws IOException
...{
int value;
Tree theTree = new Tree();
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, ");
System.out.print("insert, find, delete, or traverse: ");
int choice = 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(" ");
}
else
System.out.println("Cound not find value " + ' ');
break;
case 'd': System.out.print("Enter value to delete: ");
value = getInt();
boolean didDelete = theTree.delete(value);
if( didDelete )
System.out.print("Deleted "+ value+' ');
else
System.out.print("Cound not delete value " + ' ');
break;
case 't': System.out.print("Enter type 1,2 or 3: ");
value = getInt();
theTree.traverse(value);
break;
default:
System.out.print("Invalid entry ");
}//end switch
}//end while
}//end main()
//...............................................................................
public static String getString() throws IOException
...{
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String s= br.readLine();
return s;
}
//...............................................................................
public static char getChar() throws IOException
...{
String s = getString();
return s.charAt(0);
}
//...............................................................................
public static int getInt() throws IOException
...{
String s = getString();
return Integer.parseInt(s);
}
//...............................................................................
} // end class TreeApp
// /