二叉樹類代碼:
package binarytree;
import linkqueue.LinkQueue;
public class BinaryTree {
class Node
{
public Object data;
public Node lchild;
public Node rchild;
public Node(Object data)
{
this.data = data;
this.lchild = null;
this.rchild = null;
}
}
//根節點
private Node root = null;
private Node node = null;
/**
* 創建樹
*
* 以完全二叉樹的格式來創建(子樹不存在的用0填充),
* 對完全二叉樹中每一個節點從0開始進行編號,
* 那么第i個節點的左孩子的編號為2*i+1,右孩子為2*i+2。
*
* */
void createTree(String strtree)
{
LinkQueue lQueue = new LinkQueue();
lQueue.initQueue();
/**
* 完全二叉樹中第i層的結點的個數最多為第1到i-1層上所有節點的個數和
* 所以父節點的個數最多為N-1個,N表示節點個數
* */
for(int parentIndex =0; parentIndex<strtree.split(" ").length/2;parentIndex++)
{
if(root == null)
{
root= new Node(strtree.split(" ")[parentIndex]);
//左孩子
root.lchild = new Node(strtree.split(" ")[parentIndex*2+1]);
lQueue.enQueue(root.lchild);
//右孩子
root.rchild = new Node(strtree.split(" ")[parentIndex*2+2]);
lQueue.enQueue(root.rchild);
}else
{
if(!lQueue.isEmpty() && parentIndex*2+1<strtree.split(" ").length)//隊列不空
{
node = (Node) lQueue.deQueue();
if(parentIndex*2+1<strtree.split(" ").length)
{
//左孩子
node.lchild = new Node(strtree.split(" ")[parentIndex*2+1]);
lQueue.enQueue(node.lchild);
}
if(parentIndex*2+2<strtree.split(" ").length)
{
//右孩子
node.rchild = new Node(strtree.split(" ")[parentIndex*2+2]);
lQueue.enQueue(node.rchild);
}
}else
{
return;
}
}
}
}
/**
* 先序遍歷二叉樹
* */
void preOrderTraverse(Node node)
{
if(node == null)
{
return;
}
visit(node);
preOrderTraverse(node.lchild);
preOrderTraverse(node.rchild);
}
/**
* 中序遍歷二叉樹
* */
void inOrderTraverse(Node node)
{
if(node == null)
{
return;
}
inOrderTraverse(node.lchild);
visit(node);
inOrderTraverse(node.rchild);
}
/**
* 后序遍歷二叉樹
* */
void postOrderTraverse(Node node)
{
if(node == null)
{
return;
}
postOrderTraverse(node.lchild);
postOrderTraverse(node.rchild);
visit(node);
}
/**
* 打印二叉樹
* */
public void print()
{
System.out.print("先序遍歷:");
preOrderTraverse(root);
System.out.print("\n中序遍歷:");
inOrderTraverse(root);
System.out.print("\n后序遍歷:");
postOrderTraverse(root);
}
/**
* 訪問節點
* */
private void visit(Node node)
{
if(!node.data.equals("0"))
{
System.out.print(node.data+" ");
}
}
}
測試代碼(以數據結構中表達式a+b*(c-d)-e/f為例):
package binarytree;
public class BinaryTreeMain {
public static void main(String[] args) {
BinaryTree binaryTree = new BinaryTree();
String strtree="- + / a * e f 0 0 b - 0 0 0 0 0 0 0 0 0 0 c d";//0表示沒有值的位置
binaryTree.createTree(strtree);
binaryTree.print();
}
}
運行結果:

