Java實現二叉樹地遍歷、求深度和葉子結點的個數
阿新 • • 發佈:2019-05-05
結點 相交 stat info 通過 traverse link private java實現
一、分析
二叉樹是n個結點所構成的集合,它或為空樹,或為非空樹。對於非空樹,它有且僅有一個根結點,且除根結點以外的其余結點分為兩個互不相交的子集,分別稱為左子樹和右子樹,它們本身又都是二叉樹。
顯而易見,二叉樹具有遞歸的性質,因此表示二叉樹的結點至少要包含3個域:數據域、左指針、右指針。在Java中,我們可以將二叉樹的結點視為一個類,其中含有左子樹地址、右子樹地址和數據三個屬性,每個結點即使類的實例化對象。因為二叉樹的遞歸性質,所以我們可以通過遞歸來實現二叉樹地求深度、求葉子結點的個數、先序、中序、後序遍歷,而層序遍歷則可以通過隊列來實現。
二、實現
1、定義結點類
1class InitBiTree{ 2 3 private String data = null; 4 5 private InitBiTree lchild = null; 6 7 private InitBiTree rchild = null; 8 9 public String getData() { 10 return data; 11 } 12 13 public void setData(String data) { 14 this.data = data; 15 } 16 17 public InitBiTree getLchild() { 18 return lchild; 19 } 20 21 public void setLchild(InitBiTree lchild) { 22 this.lchild = lchild; 23 } 24 25 public InitBiTree getRchild() { 26 return rchild; 27 } 28 29 publicvoid setRchild(InitBiTree rchild) { 30 this.rchild = rchild; 31 } 32 }
2、定義方法類
1 class Tools{ 2 public static InitBiTree createBiTree() { //先序遍歷創建二叉樹 3 System.out.print("請按先序次序依次輸入二叉樹的值,#號表示建立空樹:"); 4 Scanner sc = new Scanner(System.in); 5 String input = null; 6 input = sc.next(); 7 if(input.equals("#")) { 8 return null; 9 }else { 10 InitBiTree initBiTree = new InitBiTree(); 11 initBiTree.setData(input); 12 initBiTree.setLchild(Tools.createBiTree()); 13 initBiTree.setRchild(Tools.createBiTree()); 14 return initBiTree; 15 } 16 } 17 18 public static void preOrderTraverse(InitBiTree initBiTree) { //先序遍歷 19 if(initBiTree != null) { 20 System.out.print(initBiTree.getData()); 21 Tools.preOrderTraverse(initBiTree.getLchild()); 22 Tools.preOrderTraverse(initBiTree.getRchild()); 23 } 24 } 25 26 public static void inOrderTraverse(InitBiTree initBiTree) { //中序遍歷 27 if(initBiTree != null) { 28 Tools.inOrderTraverse(initBiTree.getLchild()); 29 System.out.print(initBiTree.getData()); 30 Tools.inOrderTraverse(initBiTree.getRchild()); 31 } 32 } 33 34 public static void postOrderTraverse(InitBiTree initBiTree) { //後序遍歷 35 if(initBiTree != null) { 36 Tools.postOrderTraverse(initBiTree.getLchild()); 37 Tools.postOrderTraverse(initBiTree.getRchild()); 38 System.out.print(initBiTree.getData()); 39 } 40 } 41 42 public static void levelOrderTraverse(InitBiTree initBiTree) { //層序遍歷 43 if(initBiTree != null) { 44 LinkedList<InitBiTree> linkedList = new LinkedList<InitBiTree>(); 45 linkedList.offer(initBiTree); 46 while(!linkedList.isEmpty()) { 47 initBiTree = linkedList.poll(); 48 if(initBiTree.getLchild() != null) { 49 linkedList.offer(initBiTree.getLchild()); 50 } 51 if(initBiTree.getRchild() != null) { 52 linkedList.offer(initBiTree.getRchild()); 53 } 54 System.out.print(initBiTree.getData()); 55 } 56 } 57 } 58 59 public static int biTreeDepth(InitBiTree initBiTree) { //求二叉樹深度 60 if(initBiTree != null) { 61 int l = Tools.biTreeDepth(initBiTree.getLchild()); 62 int r = Tools.biTreeDepth(initBiTree.getRchild()); 63 if(l > r) { 64 return l + 1; 65 }else { 66 return r + 1; 67 } 68 }else { 69 return 0; 70 } 71 } 72 73 public static int biTreeNodeCount(InitBiTree initBiTree) { //求葉節點個數 74 if(initBiTree != null) { 75 int l = Tools.biTreeNodeCount(initBiTree.getLchild()); 76 int r = Tools.biTreeNodeCount(initBiTree.getRchild()); 77 if(l == 0 && r == 0) { 78 return 1; 79 }else { 80 return l + r; 81 } 82 }else { 83 return 0; 84 } 85 } 86 }
3、主函數調用
1 package word7; 2 3 import java.util.LinkedList; 4 import java.util.Scanner; 5 6 public class Main { 7 8 public static void main(String[] args) { 9 InitBiTree initBiTree = Tools.createBiTree(); 10 System.out.println("——————先序遍歷——————"); 11 Tools.preOrderTraverse(initBiTree); 12 System.out.println(); 13 System.out.println("——————中序遍歷——————"); 14 Tools.inOrderTraverse(initBiTree); 15 System.out.println(); 16 System.out.println("——————後序遍歷——————"); 17 Tools.postOrderTraverse(initBiTree); 18 System.out.println(); 19 System.out.println("——————層序遍歷——————"); 20 Tools.levelOrderTraverse(initBiTree); 21 System.out.println(); 22 System.out.println("——————二叉樹深度——————"); 23 System.out.println(Tools.biTreeDepth(initBiTree)); 24 System.out.println("——————葉子結點個數——————"); 25 System.out.println(Tools.biTreeNodeCount(initBiTree)); 26 } 27 28 }
三、運行截圖
Java實現二叉樹地遍歷、求深度和葉子結點的個數