二叉树 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
源代码:
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
相关文章推荐
- 二叉树 BinaryTree (先序、中序、后序遍历 节点查找、插入、删除 完整类) Java数据结构与算法
- 二叉树 BinaryTree (先序、中序、后序遍历 节点查找、插入、删除 完整类) Java数据结构与算法
- 二叉搜索树的相关操作:插入节点,删除节点,排序,查找,最大值,最小值,前序,中序,后序遍历(主要用到递归的方法)
- 二叉树的前序、中序、后序遍历 查找 删除
- 二叉树的中序、先序、后序、层序遍历 & 二叉树的深度 & 节点查找
- 二叉排序数(创建,插入,删除,查找及前序、中序、后序遍历)
- 二叉树的遍历 插入 查找 删除 最大值 最小值 前驱 后继节点的查找
- 二叉树各种相关操作(建立二叉树、前序、中序、后序、求二叉树的深度、查找二叉树节点,层次遍历二叉树等)(C语言版)
- 二叉树的各种操作:前序、中序、后序、层序遍历,二叉树搜索、插入和删除等操作
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由
- 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 二叉树的创建,遍历,查找,删除,插入,修改
- 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- C语言二叉树常见操作详解【前序,中序,后序,层次遍历及非递归查找,统计个数,比较,求深度】
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 顺序二叉树的建立、查找、删除、插入、替换、遍历