/**
* 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
// /
一个很全面的Binary Search Tree java实现
最新推荐文章于 2020-08-14 17:41:03 发布