算法学习——二叉树的先序、中序、后续遍历(递归)

  • 一、简单概念
    • 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种遍历的唯一方式,非递归的算法,在之后的文章中会进行梳理。

本人小白初次踏入写博客的队伍,文章中表述不清、表述有误的地方,望各位大佬指点!

二叉树的先序、中序、后续遍历(递归)相关推荐

  1. 【笔记】二叉树递归算法和非递归算法的实现 先序/中序/后续遍历 打印结点以及顺序数 构造二叉树

    递归先序遍历和中序遍历 先序: void preorder(bnode *t){if(t!=NULL){ visit(t);preorder(t->lchild); preorder(t-> ...

  2. 二叉树前序中序后续线索树_二叉树的先序,中序,后序遍历以及线索二叉树的遍历...

    二叉树的先序,中序,后序遍历以及线索二叉树的遍历 (2008-05-04 17:52:49) 标签: 杂谈 C++ 二叉树的先序,中序,后序遍历以及线索二叉树的遍历 头文件 //*********** ...

  3. 如何判断二叉树的前序,中序,后序遍历

    文章目录 前言 一.如何判断二叉树的前序,中序,后序遍历? 二.已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历? 三.程序实现 总结 前言 最近复习题中看到二叉树,对于它的前序,中序,后序遍历的 ...

  4. 二叉树的前序、中序、后序遍历(递归、非递归写法)

    文章目录 一.什么是二叉树? 二.二叉树的基本概念 三.二叉树的三种遍历方式 1.前序遍历(preordertraversal) 1.中序遍历(inordertraversal) 1.后序遍历(pos ...

  5. 二叉树--先序中序遍历求后序遍历

    先序遍历:根 左 右 中序遍历:左 根 右 后序遍历:左 右 根 我们可以先从先序遍历中找到根节点,由于知道了根节点那么可以依靠中序遍历找到左子树,右子树.这样再去先序遍历中找到左子树的根节点,然后再 ...

  6. 二十五、二叉树的前序、中序、后序遍历

    一.为何使用树这种数据结构 数组存储方式的分析 优点:通过下标方式访问元素,速度快.对于有序数组,还可使用二分查找提高检索速度. 缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较 ...

  7. 二叉树的前序、中序、后序遍历与创建

    #include <iostream> #include <string> #include <stack> using namespace std; struct ...

  8. 玩转二叉树 (25 分) 知中序遍历和前序遍历,求做个镜面反转后的层序遍历

    题目: 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列.所谓镜面反转,是指将所有非叶结点的左右孩子对换.这里假设键值都是互不相等的正整数. 输入格式: 输入第 ...

  9. LeetCode--144,94,145,102 二叉树的前序、中序、后序、层序遍历(递归,迭代,栈,队列)

    二叉树的前序.中序.后序.层序遍历(递归,迭代,栈,队列) 1. 二叉树的前序遍历 1.1 题目描述 1.2 题目分析 1.3 Python实现 2. 二叉树的中序遍历 2.1 题目描述 2.2 题目 ...

  10. 二叉树:给后序中序遍历,求前序

    给出后序中序, 求前序: 1.给后序中序求前序,因为后序序列左右根从后往前是根右左的顺序.因此递归先造右子树,再造左子树. 2.给前序中序求后序,因为前序序列是根左右,从前往后是根左右.因此递归先造左 ...

最新文章

  1. 在医疗领域你知道哪些人工智能黑科技?
  2. SAP标准成本核算重要环节详解
  3. NET问答: Entity Framework 如何快速高效的删除表中所有记录 ?
  4. 我的程序都是这样命名的:openeim001
  5. linux定时任务crontab的设置
  6. SQL Server安装程序–数据库警报
  7. $$\int_0^{nh}x(x-h)\cdots (x-nh)dx=h^{n+2}\int_0^nx(x-1)\cdots (x-n)dx$$
  8. Luogu P2827 蚯蚓
  9. 8-ORACLE四种关闭方式
  10. JAVA并发编程实践-中文-高清-带书签-完整版
  11. 【原创】启动Win10自带的XPS/OXPS阅读器
  12. 王道训练营Day1作业
  13. 【报告分享】2021年中国网络文学出海报告-艾瑞咨询(附下载)
  14. Eclipse快捷键的设置和使用(大小写快捷键等)
  15. 鸿蒙之始有几个老婆,先天五太
  16. ERDAS遥感影像处理-专题图制作
  17. 代码主题darcula_Intellij idea 中的Darcula主题怎么把颜色改回来?
  18. input type=file 标签禁止让用户手动输入
  19. 网站怎么屏蔽指定搜索引擎访蜘蛛的访问
  20. LTE学习笔记--LTE无线连接过程--UE Attach过程和Detach过程

热门文章

  1. 访问yy直播页面点击播放无响应分析
  2. Redis分布式锁----悲观锁实现,以秒杀系统为例 - 林炳文Evankaka的专栏 - CSDN博客
  3. 联盟营销最佳实践:提高联盟计划的投资回报率
  4. Linux - last 命令
  5. Circuit Design 贴片晶振的区分
  6. 2018最新win10激活密匙
  7. MapGIS完美转ArcGIS ShapeFile攻略
  8. 手写RPC(五) 核心模块网络协议模块编写 ---- 自定义协议
  9. BZOJ3557: [Ctsc2014]随机数
  10. 泰坦尼克号生命值预测