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位数字, ...
随机推荐
- 包与类的命名 - service tool util 区别
包与类的命名和定位时,service tool util 常常搞混淆,在此分析一下它们的定位: 名称 特点与定位 独立性 方法和类的属性 util 通用的.与业务无关的,可以独立出来,可供其他项目使用 ...
- 【零基础】为什么Facebook发币就不一样
参考: https://baijiahao.baidu.com/s?id=1637182596912694597&wfr=spider&for=pc https://blog.csdn ...
- python 普通继承方式和super继承方式
Python中对象方法的定义很怪异,第一个参数一般都命名为self(相当于其它语言的this),用于传递对象本身,而在调用的时候则不必显式传递,系统会自动传递. 举一个很常见的例子: >> ...
- 黑马vue---15、使用v-model实现简易计算器
黑马vue---15.使用v-model实现简易计算器 一.总结 一句话总结: 用v-model绑定了第一个数,第二个数,操作符,和结果,数据改变他们跟着变,他们变数据也跟着变 select v-mo ...
- 用gcov来检查Qt C++程序的代码覆盖率
最近才发现MinGW里面包含一个叫做gcov的工具,可以用来检查你的程序运行时调用了哪些代码,同时显示代码行被调用的次数.这个功能在代码的覆盖率和性能调优方便都能用上. 我的运行环境 Window ...
- matplotlib:plt.rcParams设置画图的分辨率,大小等信息
主要作用是设置画的图的分辨率,大小等信息 plt.rcParams['figure.figsize'] = (8.0, 4.0) # 设置figure_size尺寸 plt.rcParams['ima ...
- ubuntu下如何安装linaro工具链?
1. 获取工具链 从此处获取,如: wget https://releases.linaro.org/components/toolchain/binaries/7.3-2018.05/aarch64 ...
- 初识消息中间件之 ==> ActiveMQ
一.消息队列概述 消息(Message)是指在应用间传送的数据.消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象. 消息队列(Message Queue)是一种应用间的通信方式, ...
- React Native初始化项目后执行react-native run-ios,构建失败
今天是肿么了......一上班创建React Native项目,react-native run-ios运行就报错,运行不了...呜呜...... 一开始以为自己react-native run-io ...
- 最近忙科研立项 & 对博客的优化
最近一直在忙科研立项.... 立项书 & 答辩 ... 接下来,将对博客进行优化... (1) 依据书来学习的[需要大量截图],将用微软的 OneNote 写笔记,然后打包成pdf,上传到我的 ...