實現二叉樹(包括前序、中序、後序遍歷演算法)
阿新 • • 發佈:2019-01-02
以前沒有記筆記的習慣,結果發現曾經實現過的東西居然都忘了,現在又需要花時間去看,去寫,雖然又有所收穫,但是畢竟在走重複的路。
從今天起,開始打路標,為了以後少走回頭路:)
還請高手多指點,不勝感激!
用Java語言實現二叉樹:
1、首先定義一個二叉樹節點類:實現
1)向某個節點下面新增節點方法;
2)從某個節點前序遍歷所有樹節點;
3)從某個節點中序遍歷所有樹節點;
4)從某個節點後序遍歷所有樹節點;
/** * 二叉樹節點 * * @author dobuy * */ public class TreeNode { /** * 左樹節點 */ private TreeNode leftTreeNode; /** * 右樹節點 */ private TreeNode rightTreeNode; /** * 當前樹節點的數值 */ private int data; public TreeNode(int data) { setData(data); } /** * 新增樹節點 * * @param treeNode */ public void addTreeNode(TreeNode treeNode) { // 插入節點比當前節點小,新增到左節點上 if (getData() > treeNode.getData()) { // 當前節點存在左節點,新增至左樹節點上 if (null != getLeftTreeNode()) { getLeftTreeNode().addTreeNode(treeNode); } // 不存在左樹節點,插入節點直接設成當前的左樹節點 else { setLeftTreeNode(treeNode); } } // 否則新增到右樹節點上 else { // 當前節點存在右樹節點,新增至右樹節點上 if (null != getRightTreeNode()) { getRightTreeNode().addTreeNode(treeNode); } // 不存在右樹節點,插入節點直接設成當前的右樹節點 else { setRightTreeNode(treeNode); } } } /** * 前序遍歷樹節點 * */ public void preOrder() { // 列印當前樹節點資料 System.out.print(getData() + "\t"); // 存在左樹節點,前序遍歷左樹節點 if (null != getLeftTreeNode()) { getLeftTreeNode().preOrder(); } // 存在右樹節點,前序遍歷右樹節點 if (null != getRightTreeNode()) { getRightTreeNode().preOrder(); } } /** * 中序遍歷樹節點 * */ public void midOrder() { // 存在左樹節點,中序序遍歷左樹節點 if (null != getLeftTreeNode()) { getLeftTreeNode().midOrder(); } // 列印當前樹節點資料 System.out.print(getData() + "\t"); // 存在右樹節點,中序遍歷右樹節點 if (null != getRightTreeNode()) { getRightTreeNode().midOrder(); } } /** * 後序遍歷樹節點 */ public void backOrder() { // 存在左樹節點,後序遍歷左樹節點 if (null != getLeftTreeNode()) { getLeftTreeNode().backOrder(); } // 存在右樹節點,後序遍歷右樹節點 if (null != getRightTreeNode()) { getRightTreeNode().backOrder(); } // 列印當前樹節點資料 System.out.print(getData() + "\t"); } public TreeNode getLeftTreeNode() { return leftTreeNode; } public void setLeftTreeNode(TreeNode leftTreeNode) { this.leftTreeNode = leftTreeNode; } public TreeNode getRightTreeNode() { return rightTreeNode; } public void setRightTreeNode(TreeNode rightTreeNode) { this.rightTreeNode = rightTreeNode; } public int getData() { return data; } public void setData(int data) { this.data = data; } }
2、再定義一個二叉樹類,主要負責包裝樹節點,構造出二叉樹。如:對外提供新增資料方法,把資料轉換成樹節點,並新增到二叉樹中;
還提供了前序、中序、後序的對外介面方法;
/** * 二叉樹 * * @author dobuy */ public class BinaryTree { /** * 定義根節點 */ private TreeNode root; /** * 新增一個節點 * * @param data */ public void addNode(int data) { // 建立一個樹節點 TreeNode treeNode = new TreeNode(data); // 如果不是第一次建立,插入到根節點下面 if (null != root) { root.addTreeNode(treeNode); } // 沒有根節點時,把該節點設成根節點 else { root = treeNode; } } /** * 前序遍歷樹節點 */ public void preOrder() { if (null != root) { System.out.print("preOrder:"); root.preOrder(); System.out.println(); } else { System.out.println("there is no node in binary tree."); } } /** * 中序遍歷樹節點 */ public void midOrder() { if (null != root) { System.out.print("midOrder:"); root.midOrder(); System.out.println(); } else { System.out.println("there is no node in binary tree."); } } /** * 後序遍歷樹節點 */ public void backOrder() { if (null != root) { System.out.print("backOrder:"); root.backOrder(); System.out.println(); } else { System.out.println("there is no node in binary tree."); } } }
3、提供Junit測試類,進行簡單的功能測試:
import org.junit.Test; public class BinaryTreeTest { @Test public void test() { // 建立二叉樹物件 BinaryTree tree = new BinaryTree(); // 新增樹節點 tree.addNode(10); tree.addNode(13); tree.addNode(5); tree.addNode(7); tree.addNode(3); tree.addNode(8); tree.addNode(4); tree.addNode(20); tree.addNode(15); tree.addNode(12); tree.addNode(11); // 前序遍歷二叉樹 tree.preOrder(); // 中序遍歷二叉樹 tree.midOrder(); // 後序遍歷二叉樹 tree.backOrder(); } }
Junit執行BinaryTreeTest.java,測試結果如下
preOrder:10 5 3 4 7 8 13 12 11 20 15
midOrder:3 4 5 7 8 10 11 12 13 15 20
backOrder:4 3 8 7 5 11 12 15 20 13 10