二叉樹類代碼:
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(); } }
運行結果: