二叉树的先序、中序、后续遍历(递归)
算法学习——二叉树的先序、中序、后续遍历(递归)
- 一、简单概念
- Problem :
- Solution :
- 二、先序遍历
- 三、中序遍历
- 四、后序遍历
- 总结
- 写在最后
一、简单概念
二叉树是由3个基本单元组成:根节点、左子树和右子树。因此,若能依次遍历这3个部分,便是便利了整个二叉树。假如以L、D、R分别表示遍历左子树、访问根节点和遍历右子树,则有可能DLR、LDR、LRD、DRL、RDL、RLD这6种遍历二叉树的方案。若限定先左后右,则有先序遍历、中序遍历和后序遍历 3种情况。
Problem :
假设我们要遍历的二叉树如下图——
typedef struct Node
{int data; //二叉树节点存储的数据Node* left; //指向左节点的指针Node* right; //指向右节点的指针
};
Solution :
二、先序遍历
先上代码:
//前序遍历
void prev_order_visit(Node* root)
{if (root) //若节点存在{printf("%d ", root->data); //打印节点的数据prev_order_visit(root->left); //递归访问左节点prev_order_visit(root->right); //递归访问右节点}
}
//输出结果: 10 5 3 6 15 12
这里用一张图来展示【先序遍历】访问节点(橙色、紫色)、以及输出数据(带圈数字)的过程,其中的小数据均表示第几个步骤——
【先序遍历】的操作过程用语言来表述:
· 访问根节点(打印数据)
· 先序遍历左子树
· 先序遍历右子树
三、中序遍历
先上代码:
// 中序遍历打印
void in_order_visit(Node* root)
{if (root) //若节点存在{prev_order_visit(root->left); //递归访问左节点printf("%d ", root->data); //打印节点的数据prev_order_visit(root->right); //递归访问右节点}
}
//输出结果: 3 5 6 10 12 15
同样,用图来展示【中序遍历】的过程——
【中序遍历】的操作过程用语言来表述:
· 先序遍历左子树
· 访问根节点(打印数据)
· 先序遍历右子树
可能读到这里已经能摸索到其中的规律了
四、后序遍历
同样先上代码:
// 后序遍历打印
void post_order_visit(Node* root)
{if (root) //若节点存在{prev_order_visit(root->left); //递归访问左节点prev_order_visit(root->right); //递归访问右节点printf("%d ", root->data); //打印节点的数据}
}
//输出结果: 3 6 5 12 15 10
用图来展示【后序遍历】的过程——
【后序遍历】的操作过程用语言来表述:
· 先序遍历左子树
· 先序遍历右子树
· 访问根节点(打印数据)
总结
把先序、中序、后续遍历的3个例子中的左下节点抽取出来进行进一步的比较
结合这张图可以清晰地发现——
先序遍历:根节点的数据输出在访问左子叶和访问右子叶之前;
后序遍历:根节点的数据输出在访问左子叶和访问右子叶中间;
后续遍历:根节点的数据输出在访问左子叶和访问右子叶之后;
写在最后
本篇文章写的先序遍历、中序遍历和后序遍历都是基于递归实现的(递归的底层实现其实是一个栈.栈的特点是后进先出,也就是最后进入栈的事件是最先被处理的),当然递归不是实现这3种遍历的唯一方式,非递归的算法,在之后的文章中会进行梳理。
本人小白初次踏入写博客的队伍,文章中表述不清、表述有误的地方,望各位大佬指点!
二叉树的先序、中序、后续遍历(递归)相关推荐
- 【笔记】二叉树递归算法和非递归算法的实现 先序/中序/后续遍历 打印结点以及顺序数 构造二叉树
递归先序遍历和中序遍历 先序: void preorder(bnode *t){if(t!=NULL){ visit(t);preorder(t->lchild); preorder(t-> ...
- 二叉树前序中序后续线索树_二叉树的先序,中序,后序遍历以及线索二叉树的遍历...
二叉树的先序,中序,后序遍历以及线索二叉树的遍历 (2008-05-04 17:52:49) 标签: 杂谈 C++ 二叉树的先序,中序,后序遍历以及线索二叉树的遍历 头文件 //*********** ...
- 如何判断二叉树的前序,中序,后序遍历
文章目录 前言 一.如何判断二叉树的前序,中序,后序遍历? 二.已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历? 三.程序实现 总结 前言 最近复习题中看到二叉树,对于它的前序,中序,后序遍历的 ...
- 二叉树的前序、中序、后序遍历(递归、非递归写法)
文章目录 一.什么是二叉树? 二.二叉树的基本概念 三.二叉树的三种遍历方式 1.前序遍历(preordertraversal) 1.中序遍历(inordertraversal) 1.后序遍历(pos ...
- 二叉树--先序中序遍历求后序遍历
先序遍历:根 左 右 中序遍历:左 根 右 后序遍历:左 右 根 我们可以先从先序遍历中找到根节点,由于知道了根节点那么可以依靠中序遍历找到左子树,右子树.这样再去先序遍历中找到左子树的根节点,然后再 ...
- 二十五、二叉树的前序、中序、后序遍历
一.为何使用树这种数据结构 数组存储方式的分析 优点:通过下标方式访问元素,速度快.对于有序数组,还可使用二分查找提高检索速度. 缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较 ...
- 二叉树的前序、中序、后序遍历与创建
#include <iostream> #include <string> #include <stack> using namespace std; struct ...
- 玩转二叉树 (25 分) 知中序遍历和前序遍历,求做个镜面反转后的层序遍历
题目: 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列.所谓镜面反转,是指将所有非叶结点的左右孩子对换.这里假设键值都是互不相等的正整数. 输入格式: 输入第 ...
- LeetCode--144,94,145,102 二叉树的前序、中序、后序、层序遍历(递归,迭代,栈,队列)
二叉树的前序.中序.后序.层序遍历(递归,迭代,栈,队列) 1. 二叉树的前序遍历 1.1 题目描述 1.2 题目分析 1.3 Python实现 2. 二叉树的中序遍历 2.1 题目描述 2.2 题目 ...
- 二叉树:给后序中序遍历,求前序
给出后序中序, 求前序: 1.给后序中序求前序,因为后序序列左右根从后往前是根右左的顺序.因此递归先造右子树,再造左子树. 2.给前序中序求后序,因为前序序列是根左右,从前往后是根左右.因此递归先造左 ...
最新文章
- 在医疗领域你知道哪些人工智能黑科技?
- SAP标准成本核算重要环节详解
- NET问答: Entity Framework 如何快速高效的删除表中所有记录 ?
- 我的程序都是这样命名的:openeim001
- linux定时任务crontab的设置
- SQL Server安装程序–数据库警报
- $$\int_0^{nh}x(x-h)\cdots (x-nh)dx=h^{n+2}\int_0^nx(x-1)\cdots (x-n)dx$$
- Luogu P2827 蚯蚓
- 8-ORACLE四种关闭方式
- JAVA并发编程实践-中文-高清-带书签-完整版
- 【原创】启动Win10自带的XPS/OXPS阅读器
- 王道训练营Day1作业
- 【报告分享】2021年中国网络文学出海报告-艾瑞咨询(附下载)
- Eclipse快捷键的设置和使用(大小写快捷键等)
- 鸿蒙之始有几个老婆,先天五太
- ERDAS遥感影像处理-专题图制作
- 代码主题darcula_Intellij idea 中的Darcula主题怎么把颜色改回来?
- input type=file 标签禁止让用户手动输入
- 网站怎么屏蔽指定搜索引擎访蜘蛛的访问
- LTE学习笔记--LTE无线连接过程--UE Attach过程和Detach过程