java数据结构之二叉树

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&&current.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);
		}
	}
 

你可能感兴趣的:(java,数据结构,J#,Gmail,Go)