您的位置:首页 > 理论基础 > 数据结构算法

二叉树 BinaryTree (先序、中序、后序遍历 节点查找、插入、删除 完整类) Java数据结构与算法

2011-09-11 21:36 567 查看
二叉树 BinaryTree (先序、中序、后序遍历 节点查找、插入、删除 完整类) Java数据结构与算法

源代码:

view
plain

/**

*

* @author sunnyykn

*/

import java.io.*;

import java.util.*;

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()

{

root = null; //no nodes in tree yet

}

public Node find(int key) //find node with given key

{

Node current = root; //start at root

while(current.iData != key) //while no match

{

if(key < current.iData) //go left?

current = current.leftChild;

else //go right?

current = current.rightChild;

if (current == null) //didn't find it

return null;

}

return current;

}//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

{

Node current = root; //start at root

Node parent;

while( true )

{

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

{

parent.rightChild = newNode;

return ;

}

}//end else go right

}//end while

}//end else not 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)

{

parent = current;

if(key < current.iData)

{

isLeftChild = true;

current = current.leftChild;

}

else

{

isLeftChild = false;

current = current.rightChild;

}

if(current == null)

return false;

}//end while

//found node to delete

//if no children , simply delete it

if(current.leftChild == null && current.rightChild == null)

{

if (current == root)

root = null;

else if(isLeftChild)

parent.leftChild = null;

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 insteed

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 cannot have a left child)

return true;

}//end delete()

//return 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 left child

}

if (successor != delNode.rightChild) //if successor not 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.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(" ");

}//end while globalStack not empty

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,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("/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");

}//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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐