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位数字, ...
随机推荐
- 【csp模拟赛5】加减法--宽搜维护联通快
题目大意: 一开始想用并查集,发现很难维护联通块的代表元素,所以用了宽搜,开数组会炸,所以开一个优先队列维护,每扫完一个联通块,统计答案,清空优先队列,!!千万记住注意数组的大小!!! 代码: #in ...
- pyqt5的简单进度条程序
# -*- coding: utf-8 -*- # @Author : FELIX # @Date : 2018/5/17 16:43 from PyQt5.QtCore import QBasicT ...
- Appium进阶教程
Monkey的使用 adb shell monkey -p com.lqr.wechat -v 500 > monkey.log adb shell monkey -p com.lqr.wech ...
- 【SecureCRT】SecureCRT 护眼配色
终端有一个好的配色,不仅能保护自己的眼睛,也能给人一个好心情,本配色方案适合任意一种SSH客户端软件. 设置背景颜色 Options => Sessions options => ...
- Linux 系统设置命令之ulimit
定义 ulimit 用于限制 shell 启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小.进程数据块的大小.Shell 进程创建文件的大小.内存锁住的大小.常驻内存集的大小.打开 ...
- jsp页面,使用Struts2标签,传递和获取Action类里的参数,注意事项。<s:a action><s:iterator><s:param>ognl表达式
在编写SSH2项目的时候,除了使用<s:form>表单标签向Action类跳转并传递参数之外,很更多时候还需要用到<s:a action="XXX.action" ...
- Leetcode题目152.乘积最大子序列(动态规划-中等)
题目描述: 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6 ...
- EBS登录问题小结
1 网络问题 1)ping IP 2)telnet IP 端口 备注:如果端口能访问则直接跳转,如果不能访问则报错如下所示: 2)配置host文件 如果访问的服务器在内网,则需要配置host信息 3) ...
- Linux 下安装 Tomcat 服务器和部署 Web 应用
一.上传Tomcat服务器 二.安装Tomcat服务器 2.1.解压tomcat服务器压缩包 2.2.配置环境变量 tomcat服务器运行时是需要JDK支持的,所以必须配置好JDK用到的那些环境变量 ...
- iommu是干什么的呢?
答: 如普通的mmu,将虚拟内存地址转换为物理地址,不同的是,iommu是将设备访问的虚拟地址转换为物理地址