Java实现二叉树地遍历、求深度和叶子结点的个数
一、分析
二叉树是n个结点所构成的集合,它或为空树,或为非空树。对于非空树,它有且仅有一个根结点,且除根结点以外的其余结点分为两个互不相交的子集,分别称为左子树和右子树,它们本身又都是二叉树。
显而易见,二叉树具有递归的性质,因此表示二叉树的结点至少要包含3个域:数据域、左指针、右指针。在Java中,我们可以将二叉树的结点视为一个类,其中含有左子树地址、右子树地址和数据三个属性,每个结点即使类的实例化对象。因为二叉树的递归性质,所以我们可以通过递归来实现二叉树地求深度、求叶子结点的个数、先序、中序、后序遍历,而层序遍历则可以通过队列来实现。
二、实现
1、定义结点类
 class InitBiTree{
     private String data = null;
     private InitBiTree lchild = null;
     private InitBiTree rchild = null;
     public String getData() {
         return data;
     }
     public void setData(String data) {
         this.data = data;
     }
     public InitBiTree getLchild() {
         return lchild;
     }
     public void setLchild(InitBiTree lchild) {
         this.lchild = lchild;
     }
     public InitBiTree getRchild() {
         return rchild;
     }
     public void setRchild(InitBiTree rchild) {
         this.rchild = rchild;
     }
 }
2、定义方法类
 class Tools{
     public static InitBiTree createBiTree() {                  //先序遍历创建二叉树
         System.out.print("请按先序次序依次输入二叉树的值,#号表示建立空树:");
         Scanner sc = new Scanner(System.in);
         String input = null;
         input = sc.next();
         if(input.equals("#")) {
             return null;
         }else {
             InitBiTree initBiTree = new InitBiTree();
             initBiTree.setData(input);
             initBiTree.setLchild(Tools.createBiTree());
             initBiTree.setRchild(Tools.createBiTree());
             return initBiTree;
         }
     }
     public static void preOrderTraverse(InitBiTree initBiTree) {      //先序遍历
         if(initBiTree != null) {
             System.out.print(initBiTree.getData());
             Tools.preOrderTraverse(initBiTree.getLchild());
             Tools.preOrderTraverse(initBiTree.getRchild());
         }
     }
     public static void inOrderTraverse(InitBiTree initBiTree) {       //中序遍历
         if(initBiTree != null) {
             Tools.inOrderTraverse(initBiTree.getLchild());
             System.out.print(initBiTree.getData());
             Tools.inOrderTraverse(initBiTree.getRchild());
         }
     }
     public static void postOrderTraverse(InitBiTree initBiTree) {      //后序遍历
         if(initBiTree != null) {
             Tools.postOrderTraverse(initBiTree.getLchild());
             Tools.postOrderTraverse(initBiTree.getRchild());
             System.out.print(initBiTree.getData());
         }
     }
     public static void levelOrderTraverse(InitBiTree initBiTree) {     //层序遍历
         if(initBiTree != null) {
             LinkedList<InitBiTree> linkedList = new LinkedList<InitBiTree>();
             linkedList.offer(initBiTree);
             while(!linkedList.isEmpty()) {
                 initBiTree = linkedList.poll();
                 if(initBiTree.getLchild() != null) {
                     linkedList.offer(initBiTree.getLchild());
                 }
                 if(initBiTree.getRchild() != null) {
                     linkedList.offer(initBiTree.getRchild());
                 }
                 System.out.print(initBiTree.getData());
             }
         }
     }
     public static int biTreeDepth(InitBiTree initBiTree) {          //求二叉树深度
         if(initBiTree != null) {
             int l = Tools.biTreeDepth(initBiTree.getLchild());
                     int r = Tools.biTreeDepth(initBiTree.getRchild());
                     if(l > r) {
                         return l + 1;
                     }else {
                             return r + 1;
                     }
         }else {
             return 0;
         }
     }
     public static int biTreeNodeCount(InitBiTree initBiTree) {       //求叶节点个数
         if(initBiTree != null) {
             int l = Tools.biTreeNodeCount(initBiTree.getLchild());
             int r = Tools.biTreeNodeCount(initBiTree.getRchild());
             if(l == 0 && r == 0) {
                 return 1;
             }else {
                 return l + r;
             }
         }else {
             return 0;
         }
     }
 }
3、主函数调用
package word7; import java.util.LinkedList;
import java.util.Scanner; public class Main { public static void main(String[] args) {
InitBiTree initBiTree = Tools.createBiTree();
System.out.println("——————先序遍历——————");
Tools.preOrderTraverse(initBiTree);
System.out.println();
System.out.println("——————中序遍历——————");
Tools.inOrderTraverse(initBiTree);
System.out.println();
System.out.println("——————后序遍历——————");
Tools.postOrderTraverse(initBiTree);
System.out.println();
System.out.println("——————层序遍历——————");
Tools.levelOrderTraverse(initBiTree);
System.out.println();
System.out.println("——————二叉树深度——————");
System.out.println(Tools.biTreeDepth(initBiTree));
System.out.println("——————叶子结点个数——————");
System.out.println(Tools.biTreeNodeCount(initBiTree));
} }
三、运行截图



Java实现二叉树地遍历、求深度和叶子结点的个数的更多相关文章
- C语言实现二叉树中统计叶子结点的个数&度为1&度为2的结点个数
		算法思想 统计二叉树中叶子结点的个数和度为1.度为2的结点个数,因此可以参照二叉树三种遍历算法(先序.中序.后序)中的任何一种去完成,只需将访问操作具体变为判断是否为叶子结点和度为1.度为2的结点及统 ... 
- 【Java】 二叉树的遍历(递归与循环+层序遍历)
		在[Java] 大话数据结构(9) 树(二叉树.线索二叉树)一文中,已经实现了采用递归方法的前.中.后序遍历,本文补充了采用循环的实现方法.以及层序遍历并进行了一个总结. 递归实现 /* * 前序遍历 ... 
- Java数据结构——二叉树的遍历(汇总)
		二叉树的遍历分为深度优先遍历(DFS)和广度优先遍历(BFS) DFS遍历主要有: 前序遍历 中序遍历 后序遍历 一.递归实现DFSNode.java: public class Node { pri ... 
- java算法----------二叉树的遍历
		二叉树的遍历分为前序.中序.后序和层序遍历四种方式 首先先定义一个二叉树的节点 //二叉树节点 public class BinaryTreeNode { private int data; priv ... 
- javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题
		赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支 ... 
- 树的基本概念以及java实现二叉树
		树具有的特点有: (1)每个结点有零个或多个子结点 (2)没有父节点的结点称为根节点 (3)每一个非根结点有且只有一个父节点 (4)除了根结点外,每个子结点可以分为多个不相交的子树. 树的基本术语 ... 
- 求二叉树中第K层结点的个数
		一,问题描述 构建一棵二叉树(不一定是二叉查找树),求出该二叉树中第K层中的结点个数(根结点为第0层) 二,二叉树的构建 定义一个BinaryTree类来表示二叉树,二叉树BinaryTree 又是由 ... 
- Tree UVA - 548(二叉树递归遍历)
		题目链接:https://vjudge.net/problem/UVA-548 题目大意:给一颗点带权(权值各不相同,都是小于10000的正整数)的二叉树的中序遍历和后序遍历,找一个叶子结点使得它到根 ... 
- Java蓝桥杯练习题——求小数n位后3个数
		求整数除法小数点后第n位开始的3位数 位数不足的补0,如0.125小数第3位后三位:0.12500→500 输入格式:a b n,空格分开,a是被除数,b是除数,n是小数后的位置 输出格式:3位数字, ... 
随机推荐
- 服务器多进程powershell导致服务器瘫痪问题解决
			1.公司服务器多次无法访问,经查多由于开启了多个powershell进程,网上查询是被挖矿了,可通过将powershell应用程序重命名解决. 2.然而重命名的时候发现需要trustedInstall ... 
- JS各循环的差别
			1.最普通的for循环: for(var i=0;i<arr.length;i++){ } 特点:只能针对数组循环,不能引用于非数组对象 2.for(var i in obj){ } 特点:用于 ... 
- 使用create-react-app创建项目(一)——端口配置
			在package.json文件中找到 "scripts",在start中添加"set PORT=8000" "scripts": { &qu ... 
- 【软件工程】Alpha冲刺 (6/6)
			链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 恩泽(组长) 过去两天完成了哪些任务 描述 tomcat的学习与实现 服务器后端部署,API接口的beta版实现 后端代码 ... 
- js的dom操作(整理)(转)
			js的dom操作整理(整理)(转) 一.总结 一句话总结: dom操作有用原生js的dom操作,也可以用对js封装过的jquery等插件来来更加方便的进行dom操作 1.dom是什么? 对于JavaS ... 
- 传统web项目搭建学习
			1.安装插件 # babel安装问题,Cannot find module '@babel/core' babel-loader@8 requires Babel 7.x (the package ' ... 
- 快速解决设置Android 23.0以上版本对SD卡的读写权限无效的问题
			快速解决设置Android 23.0以上版本对SD卡的读写权限无效的问题 转 https://www.jb51.net/article/144939.htm 今天小编就为大家分享一篇快速解决设置And ... 
- GitHub代码下载和同步
			1.下载git客户端https://git-scm.com/ssh-keygen -C "your@email.address" -t rsa 2. 把下面文件的内容复制到 htt ... 
- 微信小程序:undefined Expecting 'STRING', got INVALID
			出现问题: 问题原因:app.json中不能出现注释 
- Java端使用Batik将SVG转为PNG
			在上篇中,我们需要将Highcharts生成的图通过后台保存到pdf文件中,就需要对SVG进行转换. 这里就介绍一下使用Batik处理SVG代码的方法. 首先是jar包的获取地址,https://xm ... 
