二叉树的基本概念:

正如我们所了解的,树是有很多中形态,但是我们规定,形如每个节点最多只能有两个子节点的一种形如称为二叉树。我们将二叉树中该节点的两个子节点分别称作为:左孩子节点和右孩子节点。该节点称为他们的双亲节点。

二叉树的结构示意图如下:

在二叉树的树状结构中,有两种特殊的二叉树值得我们关注。

首先如果该二叉树的所有叶子节点都在最后一层,并且节点的总数=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数据结构之二叉树的基本介绍与递归遍历的更多相关文章

  1. C++学习---二叉树的输入及非递归遍历

    二叉树的二叉链表存储表示如下 //二叉树的二叉链表存储表示 typedef struct BiTNode { char data;//结点数据域 struct BiTNode* lchild, * r ...

  2. java数据结构之二叉树的实现

    java二叉树的简单实现,可以简单实现深度为n的二叉树的建立,二叉树的前序遍历,中序遍历,后序遍历输出. /** *数据结构之树的实现 *2016/4/29 * **/ package cn.Link ...

  3. JAVA数据结构之二叉树

    用树作为存储数据的结构兼具像数组一样查询速度快和像链表一样具有很快的插入和删除数据项的优点 我们用圆点表示节点,连接圆的直线表示边如下图所示就表示了一颗树,接下来我们讨论的二叉树即每个节点最多只有两个 ...

  4. java数据结构之二叉树遍历的非递归实现

    算法概述递归算法简洁明了.可读性好,但与非递归算法相比要消耗更多的时间和存储空间.为提高效率,我们可采用一种非递归的二叉树遍历算法.非递归的实现要借助栈来实现,因为堆栈的先进后出的结构和递归很相似.对 ...

  5. java数据结构之二叉树的定义和递归实现

    定义最多有两棵子树的有序树,称为二叉树.二叉树是一种特殊的树.递归定义:二叉树是n(n>=0)个有限结点构成的集合.N=0称为空二叉树:n>0的二叉树由一个根结点和两互不相交的,分别称为左 ...

  6. 算法与数据结构(三) 二叉树的遍历及其线索化(Swift版)

    前面两篇博客介绍了线性表的顺序存储与链式存储以及对应的操作,并且还聊了栈与队列的相关内容.本篇博客我们就继续聊数据结构的相关东西,并且所涉及的相关Demo依然使用面向对象语言Swift来表示.本篇博客 ...

  7. 非递归遍历二叉树Java版的实现代码(没写层次遍历)

    直接上代码呵呵,里面有注解 package www.com.leetcode.specificProblem; import java.util.ArrayList; import java.util ...

  8. Java数据结构之树和二叉树(2)

    从这里始将要继续进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来 ...

  9. Java数据结构之树和二叉树

    从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...

随机推荐

  1. Python字符串和正则表达式中的反斜杠('\')问题

    在Python普通字符串中 在Python中,我们用'\'来转义某些普通字符,使其成为特殊字符,比如 In [1]: print('abc\ndef') # '\n'具有换行的作用 abc defg ...

  2. npm 关联 git包

    npm 关联 git包 由于现在项目越做越多,很多公共的部分相互公用,需要尽可能早地提炼出来,这样便可以在其他项目进行引用,而不是每次建一个项目就需要进行拷贝,这样太痛苦了,因而想通过类似npm包管理 ...

  3. java 字符串锁

    package com.example.demo.controller; public class StringLock { public void method(String p) { // new ...

  4. 30分钟Maven入门到精通

    Maven是近年来最流行的项目构建与管理工具.不仅简化了我们开发过程中对jar包依赖的导入,还对项目的清理.初始化.编译.测试.打包.集成测试.验证.部署和站点生成等所有构建过程进行了抽象和统一,方便 ...

  5. SQL注入的一些技巧分享

    先上一道简单的ctf注入题: 一道利用order by进行注入的ctf题 很不错的一道利用order by的注入题,之前不知道order by除了爆字段还有这种操作. 原题地址:http://chal ...

  6. javaScript运动框架之匀速运动

    运动框架 1.在开始运动时,关闭已有定时器 2.把运动和停止隔开(if/else) 匀速运动的停止条件 运动终止条件:距离足够近 Demo代码 <!DOCTYPE html> <ht ...

  7. 关于&联系我

    本文已迁移至: Github博客:https://coco5666.github.io/blog/about Gitee博客:https://coco56.gitee.io/blog/about 博客 ...

  8. Spring配置搭建——Spring学习 day1

    对象准备 1.导包 Spring core ,context ,beans ,expression ,aop Apache commons logging 2.写入一个对象 这边写入User对象 3. ...

  9. 删除表A的记录时,Oracle 报错:“ORA-02292:违反完整约束条件(XXX.FKXXX)- 已找到子记录

    1.找到以”FKXXX“为外键的表A的子表,直接运行select a.constraint_name, a.table_name, b.constraint_name from user_constr ...

  10. jmeter之Ramp-up Period(in seconds)

    [1]决定多长时间启动所有线程.如果使用10个线程,ramp-up period是100秒,那么JMeter用100秒使所有10个线程启动并运行.每个线程会在上一个线程启动后10秒(100/10)启动 ...