【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解

简介: 【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解

本篇博客(上篇)先带大家学习递归方式进行三种遍历,

而在后续的(下篇)中将为大家详细讲解非递归的三种遍历方式。


1、二叉树

二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分。

2、二叉树的递归遍历

要了解二叉树的递归遍历写法,首先来了解一下递归序

递归序就是按照先序遍历的顺序,遇到的所有结点按顺序排列,重复的结点也必须记录。

我们可以发现递归序中每个结点都会遇到三次。

这是因为当进入某一结点时,对该结点进行第一次操作,然后调用其左孩子结点,等左孩子结点结束调用时会返回自己,此时就可以对自己进行第二次操作,然后再调用其右孩子结点,等左孩子结点结束调用时又会返回自己,此时就可以对自己进行第三次操作,因为不管怎样,调用完孩子结点后终究会返回到父结点。

下面用代码来给大家举例子:

    public static void f(Node head) {
    //1
        //1
    f(head.left);
        //2
        //2
    f(head.right);
        //3
        //3
  }

上面代码中:虽然此时代码中并没有对该节点进行其他操作,但是如果有的话

注释1部分就是该结点第一次被操作的时候,

注释2部分就是该结点第二次被操作的时候,

注释3部分就是该结点第三次被操作的时候。

2.1、先序遍历

对于所有子树,都是遵循【头左右】的顺序进行操作。

例如操作是打印结点,那么就应该先打印头结点,然后在打印左子树的结点,左子树的结点打印依然遵循【头左右】的操作顺序,然后再打印右子树的结点,操作也一样。

先序遍历为:1,2,4,5,3,6,7。

对于1来说,是先打印了1再到2和3,对于3来说,是先打印了3再到6和7。

那么递归序在这里有什么用呢?递归序中第一次遇到该节点时打印结点,第二次第三次均不做任何操作,这就是先序遍历。如下图:

那么用代码表示就是在注释1处增加打印操作即是先序遍历。

  public static void preOrderRecur(Node head) {
    //1
        if (head == null) {
      return;
    }
    System.out.print(head.value + " ");   //在第一次遇到该结点时打印
        //1
    preOrderRecur(head.left);
        //2
        //2
    preOrderRecur(head.right);
        //3
        //3
  }

2.2、中序遍历

对于所有子树,都是遵循【左头右】的顺序进行操作。

例如操作是打印结点,那么就应该先打印头结点的左子树的所有结点,左子树的结点打印依然遵循【左头右】的操作顺序,然后返回到头节点此时对头节点进行打印,然后再打印右子树的结点,操作也一样。

中序遍历为:4,2,5,1,6,3,7。

对于1来说,是先打印了2再到1然后到3,对于3来说,是先打印了6再到3然后到7。

递归序中第二次遇到该节点时打印结点,第一次第三次均不做任何操作,这就是中序遍历。如下图:

那么用代码表示就是在注释2处增加打印操作即是中序遍历。

  public static void inOrderRecur(Node head) {
        //1
    if (head == null) {
      return;
    }
        //1
    inOrderRecur(head.left);
        //2
    System.out.print(head.value + " ");  //在第二次遇到该结点时打印
        //2
    inOrderRecur(head.right);
        //3
        //3
  }

2.3、后序遍历

对于所有子树,都是遵循【左右头】的顺序进行操作。

例如操作是打印结点,那么就应该先打印头结点的左子树的所有结点,左子树的结点打印依然遵循【左右头】的操作顺序,返回到头节点不做操作,然后打印右子树的结点,操作也一样。最后返回到头节点此时对头节点进行打印。

后序遍历为:4,5,2,6,7,3,1。

对于1来说,是先打印了2再到3然后到1,对于3来说,是先打印了6再到7然后到3。

递归序中第三次遇到该节点时打印结点,第一次第二次均不做任何操作,这就是后序遍历。如下图:

 那么用代码表示就是在注释3处增加打印操作即是后序遍历。

  public static void posOrderRecur(Node head) {
        //1
    if (head == null) {
      return;
    }
        //1
    posOrderRecur(head.left);
        //2
        //2
    posOrderRecur(head.right);
        //3
    System.out.print(head.value + " ");   在第三次遇到该结点时打印
        //3
  }


如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

目录
相关文章
|
1月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
70 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
11天前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
14天前
|
存储 缓存 算法
如何提高二叉树遍历算法的效率?
选择合适的遍历算法,如按层次遍历树时使用广度优先搜索(BFS),中序遍历二叉搜索树以获得有序序列。优化数据结构,如使用线索二叉树减少空指针判断,自定义节点类增加辅助信息。利用递归与非递归的特点,避免栈溢出问题。多线程并行遍历提高速度,注意线程安全。缓存中间结果,避免重复计算。预先计算并存储信息,提高遍历效率。综合运用这些方法,提高二叉树遍历算法的效率。
36 5
|
13天前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
30 2
|
14天前
|
算法
树的遍历算法有哪些?
不同的遍历算法适用于不同的应用场景。深度优先搜索常用于搜索、路径查找等问题;广度优先搜索则在图的最短路径、层次相关的问题中较为常用;而二叉搜索树的遍历在数据排序、查找等方面有重要应用。
22 2
|
17天前
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
24 0
|
1月前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
33 4
|
1月前
|
存储 算法
动态规划算法学习一:DP的重要知识点、矩阵连乘算法
这篇文章是关于动态规划算法中矩阵连乘问题的详解,包括问题描述、最优子结构、重叠子问题、递归方法、备忘录方法和动态规划算法设计的步骤。
101 0
|
1月前
|
机器学习/深度学习 搜索推荐 算法
探索数据结构:初入算法之经典排序算法
探索数据结构:初入算法之经典排序算法
|
29天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
下一篇
无影云桌面