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 }

三、运行截图

posted @ 2019-05-04 23:43  牛cattle  阅读(7599)  评论(0编辑  收藏  举报