1. 程式人生 > >Java實現二叉樹地遍歷、求深度和葉子結點的個數

Java實現二叉樹地遍歷、求深度和葉子結點的個數

結點 相交 stat info 通過 traverse link private java實現

一、分析

  二叉樹是n個結點所構成的集合,它或為空樹,或為非空樹。對於非空樹,它有且僅有一個根結點,且除根結點以外的其余結點分為兩個互不相交的子集,分別稱為左子樹和右子樹,它們本身又都是二叉樹。

  顯而易見,二叉樹具有遞歸的性質,因此表示二叉樹的結點至少要包含3個域:數據域、左指針、右指針。在Java中,我們可以將二叉樹的結點視為一個類,其中含有左子樹地址、右子樹地址和數據三個屬性,每個結點即使類的實例化對象。因為二叉樹的遞歸性質,所以我們可以通過遞歸來實現二叉樹地求深度、求葉子結點的個數、先序、中序、後序遍歷,而層序遍歷則可以通過隊列來實現。

二、實現

1、定義結點類

 1
class 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 public
void 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實現二叉樹地遍歷、求深度和葉子結點的個數