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位数字, ...
随机推荐
- 数据结构-用C++实现一个二叉树,递归方法中序遍历
1:二叉排序树,又称二叉树.其定义为:二叉排序树或者空树,或者是满足如下性质的二叉树. (1)若它的左子树非空,则左子树上所有节点的值均小于根节点的值. (2)若它的右子树非空,则右子树上所有节点的值 ...
- qt QTableView中嵌入复选框CheckBox 的四种方法总结
第一种不能之前显示,必须双击/选中后才能显示,不适用. 第二种比较简单,通常用这种方法. 第三种只适合静态显示静态数据用 第四种比较适合扩展,它除了可以嵌入复选框,还可以通过paint()绘制其它控件 ...
- 阿里云AHAS应用高可用服务初体验
AHAS是阿里云提供的应用高可用服务(Application High Availability Service)产品. 高可用这个关键词可以说是互联网及软件开发行业热度一直很高的词语了,阿里云推出的 ...
- other备忘
wps CONCATENATE 只是因为格式 设置成了文本,把这列 格式 设置成 常规,双击下 结果就出来了 https://zhidao.baidu.com/question/21208668961 ...
- leetcode25 K 个一组翻转链表
这道题关于链表的操作,中间指针操作略复杂. /** * Definition for singly-linked list. * struct ListNode { * int val; * List ...
- Django博客系统
零.创建项目及配置 一.编写 Model 层的代码 二.配置 admin 页面 三.根据需求定制 admin
- Centos7.4.1708搭建syslog服务
系统:centos7.4.1708环境:无互联网环境syslog使用端口为 UDP 514 将/etc/yum.repos.d目录下除CentOS-Media.repo文件所有文件重命名cd /etc ...
- vlc命令行: 转码 流化 推流
vlc命令行: 转码 流化 推流 写在命令行之前的话: VLC不仅仅可以通过界面进行播放,转码,流化,也可以通过命令行进行播放,转码和流化.还可以利用里面的SDK进行二次开发. vlc命令行使用方法: ...
- IDEA结合GIT的使用
一.本地安装GIT 下载: https://git-scm.com/downloads 安装 略 配置环境变量 在 “我的电脑 --> 属性 --> 高级系统设置 -- > 环境变量 ...
- Java日志体系(六)log4j2
1.1 简介 log4j2,一个日志的实现框架,是log4j的升级版本,于2014年7月正式亮相.与第一代log4j不同,log4j2完全重写了log4j的日志实现,并不是在原有基础上进行的升级,解决 ...