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

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

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

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


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
  }


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

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

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

目录
相关文章
|
12天前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
36 12
|
12天前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
37 10
|
12天前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
37 2
|
28天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
57 20
|
26天前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
50 5
|
26天前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
2月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
284 9
|
2月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
44 1
|
12天前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
128 75
|
12天前
|
存储 C++ 索引
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
34 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】

热门文章

最新文章