数据结构:树

package none010树;
import java.io.*;
import java.io.BufferedReader;
import java.util.*;
public class TreeApp {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		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: ");
			 
			char 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("\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();
				boolean didDelete=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");
			}
		}
		
	}
	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);
	}
}
class Node
{
	public int iData;
	public double dData;
	public Node leftChild;
	public Node rightChild;
	
	public void displayNode(){
		System.out.print('{');
		System.out.print(iData);
		System.out.print(", ");
		System.out.print(dData);
		System.out.print("} ");
	}
}
class Tree
{
	private Node root;
	public Tree(){
		root=null;
	}
	public Node find(int key)
	{
		Node current=root;
		while(current.iData!=key)
		{
			if(key<current.iData)
				current=current.leftChild;
			else 
				current=current.rightChild;
			if(current==null)
				return null;
		}
		return current;
	}
	public void insert(int id,double dd){
		Node newNode=new Node();
		newNode.iData=id;
		newNode.dData=dd;
		if(root==null)
			root=newNode;
		else{
			Node current=root;
			Node parent;
			while(true)
			{
				parent=current;
				if(id<current.iData)
				{
					current=current.leftChild;
					if(current==null)
					{
						parent.leftChild=newNode;
						return;
					}
				}
				else{
					current=current.rightChild;
					if(current==null){
						parent.rightChild=newNode;
						return;
					}
				}
			}
		}
	}
	public boolean delete(int key)
	{
		Node current=root;
		Node parent=root;
		boolean isLeftChild=true;
		while(current.iData!=key)
		{
			parent=current;
			if(key<current.iData)
			{
				isLeftChild=true;
				current=current.leftChild;
			}
			else
			{
				isLeftChild=false;
				current=current.rightChild;
			}
			if(current==null)
				return false;
		}
		
		if(current.leftChild==null&¤t.rightChild==null)
		{
			if(current==root)
				root=null;
			else if(isLeftChild)
				parent.leftChild=null;
			else 
				parent.rightChild=null;
		}
		else if(current.rightChild==null)
			if(current==root)
				root=current.leftChild;
			else if(isLeftChild)
				parent.leftChild=current.leftChild;
			else parent.rightChild=current.leftChild;
		else if(current.leftChild==null)
			if(current==root)
				root=current.rightChild;
			else if(isLeftChild)
				parent.leftChild=current.rightChild;
			else 
				parent.rightChild=current.rightChild;
		else
		{
			Node successor=getSuccessor(current);
			if(current==root)
				root=successor;
			else if(isLeftChild)
				parent.leftChild=successor;
			else
				parent.rightChild=successor;
			successor.leftChild=current.leftChild;
			
		}
		return true;
	}
	private Node getSuccessor(Node delNode){
		Node successorParent=delNode;
		Node successor=delNode;
		Node current=delNode.rightChild;
		while(current!=null)
		{
			successorParent=successor;
			successor=current;
			current=current.leftChild;
		}
		if(successor!=delNode.rightChild)
		{
			successorParent.leftChild=successor.rightChild;
			successor.rightChild=delNode.rightChild;
		}
		return successor;
	}
	public void traverse(int traverseType){
		switch(traverseType)
		{
		case 1: System.out.print("\nPreorder traversal: ");
				preOrder(root);
				break;
		case 2: System.out.print("\nInorder traversal: ");
		        inOrder(root);
		        break;
		case 3: System.out.print("\nPostorder traversal: ");
		        postOrder(root);
		        break;
		        
		}
		System.out.println();
	}
	private void preOrder(Node localRoot){
		if(localRoot!=null)
		{
			System.out.print(localRoot.iData+" ");
			preOrder(localRoot.leftChild);
			preOrder(localRoot.rightChild);
		}
	}
	private void inOrder(Node localRoot){
		if(localRoot!=null)
		{
			inOrder(localRoot.leftChild);
			System.out.print(localRoot.iData+" ");
		    inOrder(localRoot.rightChild);
		}
	}
	private void postOrder(Node localRoot)
	{
		if(localRoot!=null)
		{
			postOrder(localRoot.leftChild);
			postOrder(localRoot.rightChild);
			System.out.print(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(' ');
				}
				System.out.println();
				nBlanks /=2;
				while(localStack.isEmpty()==false)
					globalStack.push(localStack.pop());
			}
			System.out.println(
					"......................");
		}
		
		
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值