zoukankan      html  css  js  c++  java
  • 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 }

    三、运行截图

  • 相关阅读:
    Something broke! (Error 500)——reviewboard
    linux内核--自旋锁的理解
    I.MX6 mkuserimg.sh hacking
    I.MX6 DNS 查看、修改方法
    I.MX6 android mkuserimg.sh
    I.MX6 AW-NB177NF wifi HAL 调试修改
    I.MX6 wpa_supplicant_8 编译问题
    I.MX6 MAC Address hacking
    I.MX6 MAC地址修改
    I.MX6 U-boot imxotp MAC address 写入
  • 原文地址:https://www.cnblogs.com/ysyasd/p/10810479.html
Copyright © 2011-2022 走看看