二叉树前序遍历、中序遍历、后序遍历、层序遍历的直观理解

article/2025/8/28 0:33:59

0. 写在最前面

希望大家收藏:

本文持续更新地址:https://haoqchen.site/2018/05/23/go-through-binary-tree/

    复习到二叉树,看到网上诸多博客文章各种绕,记得头晕。个人觉得数学、算法这些东西都是可以更直观简洁地表示,然后被记住的,并不需要靠死记硬背。

本文的程序基本来源于《大话数据结构》,个人感觉是一本非常好的书,推荐去看。

1. 为什么叫前序、后序、中序?

    一棵二叉树由根结点、左子树和右子树三部分组成,若规定 D、L、R 分别代表遍历根结点、遍历左子树、遍历右子树,则二叉树的遍历方式有 6 种:DLR、DRL、LDR、LRD、RDL、RLD。由于先遍历左子树和先遍历右子树在算法设计上没有本质区别,所以,只讨论三种方式:

DLR--前序遍历(根在前,从左往右,一棵树的根永远在左子树前面,左子树又永远在右子树前面 )

LDR--中序遍历(根在中,从左往右,一棵树的左子树永远在根前面,根永远在右子树前面)

LRD--后序遍历(根在后,从左往右,一棵树的左子树永远在右子树前面,右子树永远在根前面)

需要注意几点:

  1. 根是相对的,对于整棵树而言只有一个根,但对于每棵子树而言,又有自己的根。比如对于下面三个图,对于整棵树而言,A是根,A分别在最前面、中间、后面被遍历到。而对于D,它是G和H的根,对于D、G、H这棵小树而言,顺序分别是DGH、GDH、GHD;对于C,它是E和F的根,三种排序的顺序分别为: CEF、ECF、EFC。是不是根上面的DLR、LDR、LRD一模一样呢~~
  2. 整棵树的起点,就如上面所说的,从A开始,前序遍历的话,一棵树的根永远在左子树前面,左子树又永远在右子树前面,你就找他的起点好了。
  3. 二叉树结点的先根序列、中根序列和后根序列中,所有叶子结点的先后顺序一样
  4. 建议看看文末第3个参考有趣详细的推导

                  前序遍历(DLR)                                 中序遍历(LDR)                             后序遍历(LRD)

 

2. 算法上的前中后序实现

除了下面的递归实现,还有一种使用栈的非递归实现。因为递归实现比较简单,且容易关联到前中后,所以

typedef struct TreeNode
{int data;TreeNode * left;TreeNode * right;TreeNode * parent;
}TreeNode;void pre_order(TreeNode * Node)//前序遍历递归算法
{if(Node == NULL)return;printf("%d ", Node->data);//显示节点数据,可以更改为其他操作。在前面pre_order(Node->left);pre_order(Node->right);
}
void middle_order(TreeNode *Node)//中序遍历递归算法
{if(Node == NULL)return;middle_order(Node->left);printf("%d ", Node->data);//在中间middle_order(Node->right);
}
void post_order(TreeNode *Node)//后序遍历递归算法
{if(Node == NULL)return; post_order(Node->left);post_order(Node->right);printf("%d ", Node->data);//在最后
}

3. 层序遍历

  层序遍历嘛,就是按层,从上到下,从左到右遍历,这个没啥好说的。

参考

1.《大话数据结构》

2.https://cnbin.github.io/blog/2016/01/05/er-cha-shu-de-bian-li/

3.https://blog.csdn.net/soundwave_/article/details/53120766

 

 

 


http://chatgpt.dhexx.cn/article/u5SRE0WK.shtml

相关文章

二叉树的前序遍历(递归)

遍历的作用: 它是树结构插入,删除,修改,查找和排序运算的前提,是二叉树一切运算的基础和核心。 遍历二叉树——从根结点触发,按照某种次序依次访问二叉树中所有结点,使得每个结点均被访问一次…

二叉树遍历应用之根据前序遍历建树

文章目录 题目描述题目分析及实现思路根据前序遍历序列建立二叉树 题目实现完整代码 题目描述 编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串&#xff1a…

已知二叉树前序遍历是ADCEFGHB,中序遍历是CDFEGHAB,要求画出二叉树的结构或写出后序遍历

笔试特别喜欢考这种题。先说一下思路。 首先,需要明白前序、中序、后序遍历: ①前序:根→左→右 ②中序:左→根→右 ③后序:左→右→根仅明白这个是不行的,还需要技巧。对于标题中的问题, 我们…

二叉树遍历(前序遍历、中序遍历、后序遍历)

1.说明 前序遍历: 先输出父节点,再遍历左子树和右子树 中序遍历: 先遍历左子树,再输出父节点,再遍历右子树 后序遍历: 先遍历左子树,再遍历右子树,最后输出父节点 小结: 看输出父节点的顺序,就确定是前序…

144. 二叉树的前序遍历

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1: 输入:root [1,null,2,3] 输出:[1,2,3] 示例 2: 输入:root [] 输出:[] 示例 3: 输入:root [1] 输出&a…

二叉树的前序遍历(C++)

二叉树的前序遍历 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1: 输入: root [1,null,2,3] 输出: [1,2,3]示例 2: 输入: root [] 输出: []示例 3: 输入&…

二叉树的前序遍历(C语言)

我们从两个方向讲解二叉树的前序遍历(递归迭代) 一.递归 思想: 从根节点开始向其左孩子遍历每经过一个节点记录一下该节点的数值(只在第一次经过该节点时进行记录),当走到NULL时返回上一个节点,然后遍历其右孩子,如果右孩子存在记录其数值,再重复上面操作,如果不存在为NULL直…

二叉树前序遍历--递归

前序遍历的概念:遍历顺序-根左右,从根节点往下查找,先找左子树、直至左子树为空(左子节点逐个入栈、直至左子节点为空),再找右子树(出栈找右子节点)第一次经过节点即打印,直到打印null,往回溯,打…

二叉树前序遍历(递归以及非递归)

二叉树前序遍历 对于一种数据结构而言,我们最常见的就是遍历,那么关于二叉树我们该如何去遍历呢? 请看大屏幕 。。。。 上图是一棵二叉树,前序遍历结果:1 2 4 5 3 6 咦,我想你可能会疑惑什么叫做前序遍历…

二叉树前序遍历三种方式(c++ 实现)

一.递归 递归很简单,只要在调用子节点前对当前节点进行操作即可 struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode() : val(0), left(nullptr), right(nullptr) {}TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}TreeNode(int x, …

数据结构二叉树前序遍历递归和非递归算法

2022.11.19 二叉树前序遍历递归和非递归算法 任务描述相关知识编程要求测试说明C/C代码 任务描述 本关任务:给定一棵二叉树,使用递归和非递归的方法实现二叉树的先(前)序遍历结果。 相关知识 为了完成本关任务,你需…

二叉树前序遍历(递归法和迭代法(即非递归法))——C++

声明:本文原题主要来自力扣力扣,记录此博客主要是为自己学习总结,不做任何商业等活动 本文主要讲解二叉树的前序遍历递归法和迭代法。中序遍历和后序遍历可以参考博主下面两篇博客:二叉树中序遍历(递归法和迭代法(非递…

二叉树前序遍历-迭代

二叉树的前序遍历 对于一颗二叉树,当遍历它的时候使用 递归总是轻而易举的。这是二叉树前序遍历-使用递归 public void preorderTraversal(TreeNode root){if(rootnull)return;System.out.print(root.data" ");preorderTraversal(root.left);preorderT…

二叉树前序遍历执行过程

二叉树前序遍历执行过程 前序遍历:根-左-右 图示 记录与总结,2021年 11月 12日 星期五 11:35:14 CST。

二叉树的前序遍历

二叉树文章系列: 二叉树的前序遍历二叉树的中序遍历二叉树的后序遍历二叉树的层序遍历二叉树的前序、中序、后序、层序遍历【解法完整版】 本文目录 一、解题思路:递归二、解题思路:迭代(方法1)三、解题思路&#xff…

二叉树的先序遍历

二叉树的概念 二叉树是一种特殊的树。二叉树的特点是每个节点最多有两个儿子,左边的叫左二子,右边的叫做右儿子,或者说每个结点最多有两棵子树,二叉树要么为空,要么由根节点、左子树和右子树组成,而左子树…

(数据结构)二叉树先序遍历

二叉树先序遍历 二叉树先序遍历的实现思想是: 访问根节点访问当前节点的左子树若当前节点无左子树,则访问当前节点的右子树 图 1 二叉树 以上图 1 为例,先序遍历的过程如下: 访问该二叉树的根节点,找到 1访问节点 1 …

【SpringBoot高级篇】SpringBoot集成Elasticsearch搜索引擎

【SpringBoot高级篇】SpringBoot集成Elasticsearch搜索引擎 1. 什么是Elasticsearch?2. 安装并运行Elasticsearch2.1 拉取镜像2.2 启动镜像 3. 安装kibana3.1 拉取kibana镜像3.2 启动kibana镜像 4. Elasticsearch基本概念索引(Index)文档(Do…

【Elasticsearch】 es 搜索 返回信息 字段 解释

本文为博主九师兄(QQ:541711153 欢迎来探讨技术)原创文章,未经允许博主不允许转载。 文章目录 1.概述 1.概述 官网:https://www.elastic.co/guide/en/elasticsearch/reference/5.6/search-request-body.html#request-body-search…

分布式搜索引擎 ElasticSearch(ES)

一、初识elasticsearch 1.了解ES 1)elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容。elasticsearch结合kibana、Logstash、Beats,也就是elast…