標籤:package 介紹 com oid node 左右 資料結構 顯示 img
二叉樹是我們在程式中用的最多的一種樹(個人觀點)。最簡單的一個二叉樹是由一個根節點,兩個子節點(一左一右成左右孩子節點)組成。二叉樹是數組和鏈表的結合,即包含了數組的快速尋找優點,又包含了鏈表的快速添加刪除的優點。熟練掌握二叉樹的遍曆方法是很有必要的。下面來介紹一下基於二叉樹的四種遍曆方式。
下面我們以一個棵簡單的二叉樹為例來說明四種遍曆:
建立樹節點類:
//樹節點 class TreeNode { public char val; public TreeNode left; public TreeNode right; public TreeNode(char x) { val = x; } }
中序遍曆:
先遍曆左孩子節點---根節點---右孩子節點
//中序遍曆 左-根-右 (前中後:根的位置)public void InOrder(TreeNode current){ if(current != null) { InOrder(current.left); Visit(current); InOrder(current.right); }}
前序走訪:
遍曆根節點---左孩子節點---右孩子節點
//前序走訪 根-左-右public void PreOrder(TreeNode current){ if(current != null) { Visit(current); InOrder(current.left); InOrder(current.right); }}
後序遍曆:
遍曆左孩子節點---右孩子節點---根節點
//後續遍曆 左-右-根 public void PostOrder(TreeNode current){ if(current != null) { InOrder(current.left); InOrder(current.right); Visit(current); } }
層序遍曆:
同一層節點從左往右依次遍曆。
//層序遍曆 同一層節點從左往右依次遍曆 FIFO public void LevelOrder(TreeNode current){ List<TreeNode> q = new ArrayList<TreeNode>(); while(current != null) { Visit(current); if(current.left != null) { q.add(current.left); } if(current.right != null) { q.add(current.right); } if(q.isEmpty()) return ; current = q.remove(0); } }
以上就是四種基本遍曆方式。下面我們來測試一下,首先寫一個工具函數,用來顯示當前節點的值。
//*********協助工具輔助**************** public void Visit(TreeNode node) { System.out.print(node.val); }
寫Test測試函數:
@Test public void fun() { TreeNode root = new TreeNode(‘+‘); root.left = new TreeNode(‘-‘); root.right = new TreeNode(‘E‘); root.left.left = new TreeNode(‘*‘); root.left.right = new TreeNode(‘D‘); root.left.left.left = new TreeNode(‘/‘); root.left.left.right = new TreeNode(‘C‘); root.left.left.left.left = new TreeNode(‘A‘); root.left.left.left.right = new TreeNode(‘B‘); System.out.println("中序遍曆:"); InOrder(root); System.out.println(); System.out.println("前序走訪:"); PreOrder(root); System.out.println(); System.out.println("後序遍曆:"); PostOrder(root); System.out.println(); System.out.println("層序遍曆:"); LevelOrder(root); System.out.println(); }
由上面的測試函數得到遍曆結果:
全部代碼:
package tree;import java.util.ArrayList;import java.util.List;import org.junit.Test;/** * 二叉數的遍曆 * + * - E * * D * / C * A B * @author Ranter * */public class BinaryTree { @Test public void fun() { TreeNode root = new TreeNode(‘+‘); root.left = new TreeNode(‘-‘); root.right = new TreeNode(‘E‘); root.left.left = new TreeNode(‘*‘); root.left.right = new TreeNode(‘D‘); root.left.left.left = new TreeNode(‘/‘); root.left.left.right = new TreeNode(‘C‘); root.left.left.left.left = new TreeNode(‘A‘); root.left.left.left.right = new TreeNode(‘B‘); System.out.println("中序遍曆:"); InOrder(root); System.out.println(); System.out.println("前序走訪:"); PreOrder(root); System.out.println(); System.out.println("後序遍曆:"); PostOrder(root); System.out.println(); System.out.println("層序遍曆:"); LevelOrder(root); System.out.println(); } //**************************************************************** //中序遍曆 左-根-右 (前中後:根的位置) public void InOrder(TreeNode current){ if(current != null) { InOrder(current.left); Visit(current); InOrder(current.right); } } //前序走訪 根-左-右 public void PreOrder(TreeNode current){ if(current != null) { Visit(current); InOrder(current.left); InOrder(current.right); } } //後續遍曆 左-右-根 public void PostOrder(TreeNode current){ if(current != null) { InOrder(current.left); InOrder(current.right); Visit(current); } } //層序遍曆 同一層節點從左往右依次遍曆(使用隊列層序遍曆) public void LevelOrder(TreeNode current){ List<TreeNode> q = new ArrayList<TreeNode>(); while(current != null) { Visit(current); if(current.left != null) { q.add(current.left); } if(current.right != null) { q.add(current.right); } if(q.isEmpty()) return ; current = q.remove(0); } } //*********協助工具輔助**************** public void Visit(TreeNode node) { System.out.print(node.val); } //樹節點 class TreeNode { public char val; public TreeNode left; public TreeNode right; public TreeNode(char x) { val = x; } }}
資料結構Java版之遍曆二叉樹(六)