package com.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Stack; /** * * @author hf * @email [email protected] * @since 2010-11-10 * @version 1.0 * */ class Node { public int iData; //Data item(key) public Double dData; //Data item public Node leftChild; //this Node leftChild public Node rightChild; //this Node rightChild public void displayNode() //display ourself { System.out.print("{"); System.out.print(iData); System.out.print("}"); 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 non-empty tree) Node current = root; //start at root while(current.iData!=key) //while no much { 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) //(exsit internally) { parent = current; if(id<current.iData) //go left { 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 { //insert on right parent.rightChild = newNode; return; } } //end else go right }//end while } //end else no root } //end insert() public boolean delete(int key) //delete Node with given key { //(assumes non-empty tree) 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,simple delete it if(current.leftChild==null&¤t.rightChild==null) { if(current==root) //if root current = null; //tree is empty else if(isLeftChild) parent.leftChild = null; //disconnect else //from parent parent.rightChild = null; } //if no right children,replace with left subtree else if(current.rightChild==null) { if(current==root) root = current.rightChild; else if(isLeftChild) parent.leftChild = current.leftChild; else parent.rightChild = current.leftChild; } //if not left children,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; } else //two children,so replace with inOrder successor { //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 not hava a left child) return true; //success }//end delete() //returns node with next-highest value after delNode //go 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) //util no more { //left children, successorParent = successor; successor = current; current = current.leftChild; //go to left child } //if successor not if(successor!=delNode.rightChild) //right child, { //make connections successorParent.leftChild = successor.rightChild; successor.rightChild = delNode.rightChild; } return successor; } public void traverse(int TraverseType) { switch (TraverseType) { case 1: System.out.println("\nPreorder traversal: "); preOrder(root); break; case 2: System.out.println("\nInorder traversal: "); inOrder(root); break; case 3: System.out.println("\nPostorder traversal: "); postOrder(root); break; } System.out.println(); } private void preOrder(Node localRoot) { if(localRoot!=null) { System.out.println(localRoot.iData+" "); preOrder(localRoot.leftChild); preOrder(localRoot.rightChild); } } private void inOrder(Node localRoot) { if(localRoot!=null) { inOrder(localRoot.leftChild); System.out.println(localRoot.iData+" "); inOrder(localRoot.rightChild); } } private void postOrder(Node localRoot) { if(localRoot!=null) { postOrder(localRoot.leftChild); postOrder(localRoot.rightChild); System.out.println(localRoot.iData+" "); } } 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 is not enmpty 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 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 chiose = getChar(); switch (chiose) { 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 the value to delete: "); value = getInt(); boolean didDelete = theTree.delete(value); if(didDelete) System.out.print("Delete"+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"); break; } } } 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); } }