树的递归遍历

void pre(Node head) { // 先序if (head == null) return;printf("%c ", head.element);pre(head.left);pre(head.right);
}
void in(Node head) { // 中序if (head == null) return;in(head.left);printf("%c ", head.element);in(head.right);
}
void post(Node head) { // 后序if (head == null) return;post(head.left);post(head.right);printf("%c ", head.element);
}


先序遍历:头 -> 左 -> 右,先序序列:A B D E C F G

中序遍历:左 -> 头 -> 右,中序序列:D B E A F C G

后序遍历:左 -> 右 -> 头,后序序列:D E B F G C A

背到烂的代码,背到烂的递归调用顺序,然而手动模拟仍然老出错

递归序

// 抽象,抽象,不断抽象。总结规律
void f(Node head) { // 先序?中序?后序if (head == null) return;printf("%c ", head.element); // 1. 打印,先序f(head.left);printf("%c ", head.element); // 2. 打印,中序f(head.right);printf("%c ", head.element); // 3. 打印,后序
}

上述代码运行,递归序列:A B D D D B E E E B A C F F F C G G G C A

观察

先序遍历:第一次经过时打印,先序序列:A B D E C F G

中序遍历:第二次经过时打印,中序序列:D B E A F C G

后序遍历:第三次经过时打印,后序序列:D E B F G C A

为什么?

为什么先序遍历中某个节点左边与后序遍历中该节点右边的交集是这个节点的祖先节点?


举例

左图以 F 为例,递归序:A B D D D B E E E B A C F F H H H F C G G G C A

先序:A B D E C F H G;后序:D E B H F G C A

A B D E C 与 G C A 交为 A C 是 F 的祖先

右图以 E 为例,递归序:A B D D D B E H H H E E B A C F F F C G G G C A

先序:A B D E H C F G;后序:D H E B F G C A

A B D 与 B F G C A 交为 A B 是 E 的祖先

观察

  1. 先序遍历:一定会打印根节点左子树,该节点的祖宗
  2. 后序遍历:一定不打印根节点右子树,该节点的祖宗
  3. 所以两者交集只有该节点的祖宗

为什么会会产生这种现象?回头看一下递归序

因为先序遍历第一次就会打印,后序遍历要到第三次才打印

参考资料

  • 左程云 《算法和数据结构体系学习班》

树的递归遍历与递归序相关推荐

  1. 二叉树的非递归遍历(递归和非递归)

    二 叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是 递归定义,因此采用递归的方法去实现树的三种遍历不仅 ...

  2. 树的前序遍历、中序遍历、后序遍历详解

    1.前序遍历 对于当前节点,先输出该节点,然后输出他的左孩子,最后输出他的右孩子.以上图为例,递归的过程如下: (1):输出 1,接着左孩子: (2):输出 2,接着左孩子: (3):输出 4,左孩子 ...

  3. c++ 删除二叉树的子树_数据结构—树|二叉树|前序遍历、中序遍历、后序遍历【图解实现】...

    点击蓝字关注我们 AI研习图书馆,发现不一样的精彩世界 数据 结构 二叉树的遍历 一.树 在谈二叉树的知识点之前,我们首先来看一下树和图的基本概念.树:不包含回路的连通无向图,树是一种简单的非线性结构 ...

  4. 关于树的前序遍历,中序遍历,后序遍历的相互转化(含代码实现)

    2019独角兽企业重金招聘Python工程师标准>>> 首先我们需要了解的是前序遍历.中序遍历.后序遍历的概念. 前序遍历: 1.首先访问根节点 2.然后遍历左子树 3.最后遍历右子 ...

  5. 二叉树的非递归遍历和递归遍历

    文章目录 前言 前序遍历 递归 非递归 中序遍历 递归 非递归 后序遍历 递归 非递归 层序遍历 前言 二叉树的遍历有前序遍历.中序遍历.后续遍历.层序遍历.然后我们分别实现一下各种遍历的递归与非递归 ...

  6. 算法入门 | 二叉树的递归遍历、递归创建系列(递归)

    目录 1. 二叉树的遍历规则 2. 二叉树的结构体设计 [leftchild  data  rightchild] 3. 二叉树的递归先序.中序.后序遍历 4. 利用已知字符串(二叉树的先序序列)递归 ...

  7. 树的前序遍历和后序遍历

    非二叉树的前后序遍历 采用按层次序来建立树的孩子兄弟表示法(一个指针指向第一个孩子,一个指针指向第一个右兄弟)存储结构,实现前序和后序遍历树的操作,并编写算法求树的深度.输出的参考样张如下所示. PS ...

  8. Tree Recovery(二叉树递归遍历+求后序遍历模板)

    题意:已知先序和中序,将后序求出来 Little Valentine liked playing with binary trees very much. Her favorite game was ...

  9. 剑指-利用树的前序遍历和中序遍历结果,输出树的原始结构

    需要注意两点:1.对于前序遍历第一个即为根节点.2.在前序遍历找到根节点之后,在中序遍历中根节点之前的全部为根节点的左子树,后面的全部为右子树.所以可以根据中序遍历中根节点之前的数量,在前序遍历中找出 ...

最新文章

  1. java URI 与URL问题
  2. matlabfor循环语句举例_笨办法学python(七)条件、选择和循环
  3. Dev控件使用 - 皮肤
  4. .so 依赖目录 cmake_cmake浅析
  5. 对象 普通po转_厦门2020年转学怎么转?需要什么材料?你想知道的答案都在这!......
  6. Git中Add后对部分文件进行取消
  7. PS 色调——老照片效果
  8. linux查看pid 对应的程序_资深程序员总结:分析 Linux 进程的 6 个方法,我全都告诉你...
  9. 万字长文剖析 APM 系统?如何设计与实现?
  10. 经理必看的8个管理网站
  11. 如何理解C++中的.h文件和.cpp文件
  12. Selenium初级 | 使用navigate系列方法操作网页
  13. AR涂涂乐⭐一、unity高版本ImageTarget识别图开始是空白的解决办法、UI自适度
  14. 调css p 段落间距,html P标签段落 CSS段落间距距离调整
  15. 拍照基础方法及构图技巧
  16. mysql 漏洞 wa_[漏洞案例]thinkcmf 2.x从sql注入到getshell实战
  17. 【调优方法】——warmup
  18. Linux驱动设计——硬件基础
  19. SSH不能传输文件问题
  20. 「雕爷学编程」Arduino动手做(23)——矩形脉冲发生器

热门文章

  1. 后缀自动机1003 HDU 4416
  2. DELPHI各种颜色表达式
  3. LeetCode刷题笔记 二分查找 局部有序
  4. 日内短线亏钱最大原因是什么?
  5. 2018航电多校练习第9场-快速幂
  6. 使用宏模拟offsetof
  7. python获取上一级目录
  8. 【C++ 程序】 随机数
  9. linux下c语言调用mysql,Linux下C语言连接MySQL
  10. 黄铮,张一鸣,宿华退居二线的背后,暗藏玄机,没那么简单