Java二叉树的四种遍历方式详解

Java二叉树的四种遍历方式详解

二叉树是一种常见的数据结构,在Java中也有很多实现方式。对二叉树进行遍历是必不可少的操作,Java提供了四种不同的遍历方式,这篇文章会详细讲解这四种方法,以及对应的代码实现和示例说明。

什么是二叉树

二叉树是一种树结构,其每个结点最多只有两个子节点。其中一个为左子节点,一个为右子节点。

每个结点都由三部分组成:一个数据域、左子树和右子树。左子树和右子树同样是二叉树,其结点也由三部分组成:一个数据域、左子树和右子树。

代码实现

在Java中,我们可以通过类似下面的代码来定义一个二叉树节点的类:

class TreeNode{
    int val;
    TreeNode left;
    TreeNode right;
    public TreeNode(int val){
        this.val = val;
        this.left = null;
        this.right = null;
    }
}

二叉树的四种遍历方式

先序遍历

先序遍历是指对二叉树的遍历方式是“根节点->左子树->右子树”。

先序遍历可以通过递归实现,对于每个结点,先输出该结点的数据域,然后递归遍历该结点的左子树和右子树。

public void preorderTraversal(TreeNode root){
    if(root == null){
        return;
    }
    System.out.print(root.val+" ");
    preorderTraversal(root.left);
    preorderTraversal(root.right);
}

中序遍历

中序遍历是指对二叉树的遍历方式是“左子树->根节点->右子树”。

中序遍历同样可以通过递归实现,对于每个结点,先递归遍历该结点的左子树,然后输出该结点的数据域,最后递归遍历该结点的右子树。

public void inorderTraversal(TreeNode root){
    if(root == null){
        return;
    }
    inorderTraversal(root.left);
    System.out.print(root.val+" ");
    inorderTraversal(root.right);
}

后序遍历

后序遍历是指对二叉树的遍历方式是“左子树->右子树->根节点”。

后序遍历同样可以通过递归实现,对于每个结点,先递归遍历该结点的左子树和右子树,然后输出该结点的数据域。

public void postorderTraversal(TreeNode root){
    if(root == null){
        return;
    }
    postorderTraversal(root.left);
    postorderTraversal(root.right);
    System.out.print(root.val+" ");
}

层次遍历

层次遍历是指对二叉树的遍历方式是按照层次从上到下,从左到右进行遍历,每层结点从左到右输出。

层次遍历需要借助队列实现,将根结点加入队列中,然后依次出队遍历队列中的结点,将其非空子节点加入队列中。

public void bfsTraversal(TreeNode root){
    if (root == null){
        return;
    }
    Queue<TreeNode> queue = new LinkedList<>();
    queue.offer(root);
    while (!queue.isEmpty()){
        int size = queue.size();
        for (int i = 0; i < size; i++) {
            TreeNode node = queue.poll();
            System.out.print(node.val+" ");
            if(node.left != null){
                queue.offer(node.left);
            }
            if(node.right != null){
                queue.offer(node.right);
            }
        }
    }
}

示例说明

示例1

我们先创建一颗二叉树:

      1
     / \
    2   3
   / \   \
  4   5   6

我们可以先通过对应的代码创建这棵树:

TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(5);
root.right.right = new TreeNode(6);

然后我们可以通过先序遍历方法遍历这棵树,并输出结果:

preorderTraversal(root); // 1 2 4 5 3 6

同样地,我们可以通过其他三个遍历方式来遍历这棵树,并输出结果。

示例2

我们再创建一棵二叉树:

        5
       / \
      4   7
     /   / \
    2   6   8

同理,我们可以先通过对应的代码来创建这棵树:

TreeNode root = new TreeNode(5);
root.left = new TreeNode(4);
root.right = new TreeNode(7);
root.left.left = new TreeNode(2);
root.right.left = new TreeNode(6);
root.right.right = new TreeNode(8);

然后我们可以通过层次遍历方法遍历这棵树,并输出结果:

bfsTraversal(root); // 5 4 7 2 6 8

同样地,我们也可以通过其他三个遍历方式来遍历这棵树,并输出结果。

总的来说,Java二叉树的四种遍历方式都是通过递归来实现的,代码实现也比较简单。但我们要注意不同遍历方式的顺序,并了解对应的遍历顺序特点,才能适当地应用到实际工作当中。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java二叉树的四种遍历方式详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • java中File类应用遍历文件夹下所有文件

    下面是关于“java中File类应用遍历文件夹下所有文件”的攻略: 1. 使用递归法遍历文件夹下所有文件 如果需要遍历一个文件夹下所有文件,可以使用递归法来实现。首先使用File类获取到当前目录文件夹下的所有文件和文件夹,如果是文件就打印文件名,否则则递归调用本身遍历文件夹。 示例代码如下: import java.io.File; public class…

    Java 2023年5月19日
    00
  • BaseJDBC和CRUDDAO的写法实例代码

    恩,关于“BaseJDBC和CRUDDAO的写法实例代码”的完整攻略,下面是我准备的详细讲解: 1. 什么是BaseJDBC和CRUDDAO? BaseJDBC是一种基于JDBC的框架,可以简化JDBC的使用,在开发过程中提升开发效率; CRUDDAO(即CRUD DAO)是一个数据访问对象(DAO)的通用接口,可以对任意类型的实体类型进行简单的CRUD操作…

    Java 2023年6月16日
    00
  • java线程池中线程数量到底是几

    首先让我们来了解一下Java线程池。 线程池是一种线程使用方式的抽象,它可以优化多线程的资源使用情况。通过重复利用已创建的线程,降低线程创建和销毁的开销,提高响应速度。 而Java中的线程池主要由ThreadPoolExecutor类实现,该类有以下构造方法 public ThreadPoolExecutor(int corePoolSize, //核心线程…

    Java 2023年5月26日
    00
  • Java全面细致讲解Cookie与Session及kaptcha验证码的使用

    Java全面细致讲解Cookie与Session及kaptcha验证码的使用 在Java Web开发中,Cookie、Session和验证码(kaptcha)是常见的几个概念。本篇文章将全面讲解这几个概念的细节,并通过示例来演示如何使用它们。 Cookie 什么是Cookie? Cookie是一种在客户端(浏览器)中保存数据的机制,通常用于记录用户的状态、用…

    Java 2023年6月15日
    00
  • Go语言实现遗传算法的实例代码

    针对Go语言实现遗传算法的实例代码,以下是详细攻略: 1. 什么是遗传算法 遗传算法是一种基于进化论思想的优化算法,它最初由John Holland提出。遗传算法不同于传统的算法,传统算法更多的是通过数学计算,寻找满足特定约束条件的局部最优解。而遗传算法更像一种模拟自然界进化的过程,遗传算法是一种无约束优化算法,可以用于求解各种复杂非线性问题。 2. 遗传算…

    Java 2023年5月19日
    00
  • SpringDataJPA之Specification复杂查询实战

    下面详细讲解“SpringDataJPA之Specification复杂查询实战”的完整攻略。 一、什么是Specification Specification(规范)是Spring Data JPA提供的一种查询定义方式,它可以让我们通过编写Java代码构造查询,从而实现类似HQL的灵活嵌入查询的功能。Specification提供了查询复杂条件时的灵活性…

    Java 2023年5月20日
    00
  • Java中的8大基本数据类型详解

    Java中的8大基本数据类型详解 在Java中,8大基本数据类型指的是boolean、byte、char、short、int、long、float、double这8种数据类型。它们是Java的基础数据类型,在Java程序中经常被用到。 boolean类型 boolean类型用于存储真假值,取值只有两种:true和false。在Java中,布尔类型的默认值是f…

    Java 2023年5月26日
    00
  • 面向对象编程依赖注入详解

    面向对象编程依赖注入详解 什么是依赖注入 依赖注入(Dependency Injection,简称DI)是一种在面向对象编程中,将类间依赖关系的创建和管理权交给其他专门的类来处理的技术。通俗的说,就是让调用类摆脱创建和管理被调用类对象的束缚,将创建和管理依赖对象的工作交给容器来完成。 DI的优点 降低了系统模块间的耦合度。 可以提高模块的可重用性、可测试性和…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部