Java数据结构之二叉树的基本介绍与递归遍历
二叉树的基本概念:
正如我们所了解的,树是有很多中形态,但是我们规定,形如每个节点最多只能有两个子节点的一种形如称为二叉树。我们将二叉树中该节点的两个子节点分别称作为:左孩子节点和右孩子节点。该节点称为他们的双亲节点。
二叉树的结构示意图如下:

在二叉树的树状结构中,有两种特殊的二叉树值得我们关注。
首先如果该二叉树的所有叶子节点都在最后一层,并且节点的总数=2^n-1,n为层数(相当于,该二叉树最底层没有空余的位置),这样的二叉树我们称为满二叉树。
满二叉树的结构示意图如下:

如果该二叉树的所有叶子节点都在该树的最后一层或倒数第二层,并且最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续,这样的二叉树我们称为完全二叉树。
完全二叉树的结构示意图如下:

由以上两个图我们可以了解到,满二叉树是完全二叉树的一种。
二叉树的遍历操作:
二叉树的遍历操作主要有三种:先序遍历,中序遍历,后序遍历。
(1).先序遍历:先输出父节点,再遍历左子树,再遍历右子树。
(2).中序遍历:先遍历左子树,再输出父节点,再遍历右子树。
(3).后序遍历:先遍历左子树,再遍历右子树,再输出父节点。
结论:看输出父节点的顺序,就可以确认到底是先序,中序还是后序。
下面我将用一个示意图来表示先序,中序,后序的执行过程。

下面我会通过代码来具体描述二叉树遍历的执行过程,具体的详解再代码的注释中说明:
package tree;
public class BinaryTreeDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建二叉树,这里面采用手动的创建,后面的讲解中会使用递归创建
HeroNode root = new HeroNode(1, "java");
HeroNode node2 = new HeroNode(2, "c");
HeroNode node3 = new HeroNode(3, "c++");
HeroNode node4 = new HeroNode(4, "python");
HeroNode node5 = new HeroNode(5, "c#");
BinaryTree binary = new BinaryTree();
//手动的创建二叉树,得到的二叉树与我们示意图中的二叉树相同
root.setLeft(node2);
root.setRight(node3);
node3.setLeft(node4);
node3.setRight(node5);
//把上述创建的二叉树与我们定义的二叉树的类相关联
binary.setRoot(root);
binary.preOrder();
System.out.println("=======");
binary.infixOrder();
System.out.println("=======");
binary.postOrder();
}
}
class BinaryTree{
//私有化一个root节点
private HeroNode root;
public HeroNode getRoot() {
return root;
}
//获取root节点
public void setRoot(HeroNode root) {
this.root = root;
}
//先序遍历
public void preOrder(){
if(this.root!=null){
this.root.preOrder();
}else{
System.out.println("二叉树为空,无法创建!");
}
}
//中序遍历
public void infixOrder(){
if(this.root!=null){
this.root.infixOrder();
}else{
System.out.println("二叉树为空,无法创建!");
}
}
//后序遍历
public void postOrder(){
if(this.root!=null){
this.root.postOrder();
}else{
System.out.println("二叉树为空,无法创建!");
}
}
}
//先创建节点
class HeroNode{
private int no;
private String name;
private HeroNode left; //默认为null
private HeroNode right; //默认为null
public HeroNode(int no,String name){
this.no = no;
this.name = name;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public HeroNode getLeft() {
return left;
}
public void setLeft(HeroNode left) {
this.left = left;
}
public HeroNode getRight() {
return right;
}
public void setRight(HeroNode right) {
this.right = right;
}
@Override //代表覆盖方法,重载
public String toString() {
return "HeroNode [no=" + no + ", name=" + name + "]";
}
//节点的先序遍历,中序遍历,后续遍历必须定义在这里,因为在二叉树执行递归的时候,只能通过这里找到该方法,否则执行不了。
public void preOrder(){
System.out.println(this); //首先,输出父节点
if(this.getLeft()!=null){ //如果左孩子存在的话,那么递归左子树
this.getLeft().preOrder();
}
if(this.getRight()!=null){ //如果右孩子存在的话,那么递归右子树
this.getRight().preOrder();
}
}
public void infixOrder(){
if(this.getLeft()!=null){ //如果左孩子存在的话,那么递归左子树
this.getLeft().infixOrder();
}
System.out.println(this); //输出父节点
if(this.getRight()!=null){ //如果右孩子存在的话,那么递归右子树
this.getRight().infixOrder();
}
}
public void postOrder(){
if(this.getLeft()!=null){ //如果左孩子存在的话,那么递归左子树
this.getLeft().postOrder();
}
if(this.getRight()!=null){ //如果右孩子存在的话,那么递归右子树
this.getRight().postOrder();
}
System.out.println(this); //输出父节点
}
}
上述代码我们最终得到的结果是:

与我们示意图中的执行过程相同。
Java数据结构之二叉树的基本介绍与递归遍历的更多相关文章
- C++学习---二叉树的输入及非递归遍历
二叉树的二叉链表存储表示如下 //二叉树的二叉链表存储表示 typedef struct BiTNode { char data;//结点数据域 struct BiTNode* lchild, * r ...
- java数据结构之二叉树的实现
java二叉树的简单实现,可以简单实现深度为n的二叉树的建立,二叉树的前序遍历,中序遍历,后序遍历输出. /** *数据结构之树的实现 *2016/4/29 * **/ package cn.Link ...
- JAVA数据结构之二叉树
用树作为存储数据的结构兼具像数组一样查询速度快和像链表一样具有很快的插入和删除数据项的优点 我们用圆点表示节点,连接圆的直线表示边如下图所示就表示了一颗树,接下来我们讨论的二叉树即每个节点最多只有两个 ...
- java数据结构之二叉树遍历的非递归实现
算法概述递归算法简洁明了.可读性好,但与非递归算法相比要消耗更多的时间和存储空间.为提高效率,我们可采用一种非递归的二叉树遍历算法.非递归的实现要借助栈来实现,因为堆栈的先进后出的结构和递归很相似.对 ...
- java数据结构之二叉树的定义和递归实现
定义最多有两棵子树的有序树,称为二叉树.二叉树是一种特殊的树.递归定义:二叉树是n(n>=0)个有限结点构成的集合.N=0称为空二叉树:n>0的二叉树由一个根结点和两互不相交的,分别称为左 ...
- 算法与数据结构(三) 二叉树的遍历及其线索化(Swift版)
前面两篇博客介绍了线性表的顺序存储与链式存储以及对应的操作,并且还聊了栈与队列的相关内容.本篇博客我们就继续聊数据结构的相关东西,并且所涉及的相关Demo依然使用面向对象语言Swift来表示.本篇博客 ...
- 非递归遍历二叉树Java版的实现代码(没写层次遍历)
直接上代码呵呵,里面有注解 package www.com.leetcode.specificProblem; import java.util.ArrayList; import java.util ...
- Java数据结构之树和二叉树(2)
从这里始将要继续进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来 ...
- Java数据结构之树和二叉树
从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...
随机推荐
- String.equals()方法、整理String类的Length()、charAt()、 getChars()、replace()、 toUpperCase()、 toLowerCase()、trim()、toCharArray()
equals 是比较的两个字符串是否一样 length() 返回字符串的长度 charAt (int index) 返回index所指定的字符 getChars(int srcBegin,int sr ...
- 为webService添加Interceptor(拦截器)
今天写一个简单的拦截器,以webService接口为例: 背景:H5的一个项目,只要调用H5webService 接口下面的方法都会触发一个AuthorityInterceptor去验证是否调用类型是 ...
- [gym101981M][2018ICPC南京M题]Mediocre String Problem
题目链接 题目大意是问在$S$串中找区间$[i,j]$,在$T$串中找位置$k$,使得$S[i,j]$和$T[1,k]$可以组成回文串,并且$j-i+1>k$,求这样的三元组$(i,j,k)$的 ...
- python简介与简单入门
1.计算机基础 计算机组成: 输入输出设备内. 存储器 .cpu .电源 .显卡 中央处理器(cpu) 处理各种数据 相当于人的大脑 内存 存储数据 相当于临时记忆 硬盘 存储数据 相当于人的永久记忆 ...
- 22、nlpir 人工智能
练习介绍 [程序功能] 我们将完成一个和语义识别相关的爬虫程序,输入任意词汇.句子.文章或段落,会返回联想的词汇. [背景信息] 有一个非常牛的处理语言的网站nlpir,上面有非常多的处理语言的功能( ...
- ABAP JSON转换
REPORT ztest_json. DATA: json_ser TYPE REF TO cl_trex_json_serializer, json_des TYPE REF TO zcl_trex ...
- 2019-11-29-VisualStudio-2019-尝试使用-C#-8.0-新的方式
title author date CreateTime categories VisualStudio 2019 尝试使用 C# 8.0 新的方式 lindexi 2019-11-29 08:41: ...
- 286-基于6U VPX 的mSATA高性能数据存储板
基于6U VPX 的mSATA高性能数据存储板 一.板卡概述 该产品系我司自主研发.基于标准6U VPX架构. 二.产品特性 最大存储容量8TB 读写方式RAID0 ,读写速 ...
- HB-打包
一.文件打包 1.上传文件到根目录下 2.修更改启动文件 3.更改启动图标 四.启动图 https://www.yasuotu.com/size 480*762 720*1242 1080*1882
- Interviewe HDU - 3486 (ST表+枚举 )(非二分,看下这个数据、)
YaoYao has a company and he wants to employ m people recently. Since his company is so famous, there ...