tree traversal (树的遍历) - preorder traversal (前序遍历)

1. tree traversal - 树的遍历

二叉树的遍历 (traversing binary tree) 是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。遍历是将二叉树中的结点信息由非线性排列变为某种意义上的线性排列,遍历操作使非线性结构线性化。

前序遍历 (preorder) - 中序遍历 (inorder) - 后序遍历 (postorder) - 层序遍历 (breadth-first)。

二叉树由根结点、左子树和右子树三部分组成。假设 D、L、R 分别代表遍历根结点、遍历左子树、遍历右子树,则二叉树的遍历方式有 6 种:DLR、DRL、LDR、LRD、RDL、RLD。先遍历左子树和先遍历右子树在算法设计上没有本质区别,如果我们限制了从左到右的习惯方式,那么主要就分为前序遍历 (preorder) - 中序遍历 (inorder) - 后序遍历 (postorder) - 层序遍历 (breadth-first) 四种。

1.1 深度优先搜索 (depth-first search,DFS)

二叉树的深度优先遍历可细分为前序遍历、中序遍历、后序遍历。这三种遍历可以用递归实现,也可使用迭代实现。

  1. DLR - 前序遍历 (根在前,从左往右,一棵树的根永远在左子树前面,左子树永远在右子树前面)。
  2. LDR - 中序遍历 (根在中,从左往右,一棵树的左子树永远在根前面,根永远在右子树前面)。
  3. LRD - 后序遍历 (根在后,从左往右,一棵树的左子树永远在右子树前面,右子树永远在根前面)。

前序遍历 (preorder) - 中序遍历 (inorder) - 后序遍历 (postorder) 是针对根节点而言的,左右子树的遍历顺序不变,前序就是根节点最先遍历,然后左右子树。中序是把根节点放在中间遍历。后序是把根节点放在最后遍历。

  1. 根是相对的,对于整棵树而言只有一个根,但对于每棵子树而言,又有自己的根。对于整棵树而言,A 是根,A 分别在前面、中间、后面被遍历到。对于 D,它是 G 和 H 的根。对于 D、G、H 这棵树而言,三种排序顺序分别是 DGH、GDH、GHD。对于 C,它是 E 和 F 的根,三种排序顺序分别是 CEF、ECF、EFC。
  2. 整棵树的起点,从 A 开始,前序遍历的话,一棵树的根永远在左子树前面,左子树又永远在右子树前面。
  3. 二叉树结点的先根序列、中根序列和后根序列中,所有叶子结点的先后顺序一样。

1.2 广度优先搜索 - 宽度优先搜索 - 横向优先搜索 (breadth-first search,BFS)

层序遍历 (breadth-first) 层序遍历是按层从上到下,从左到右遍历。

2. 前序遍历 (preorder)

二叉树有三类节点:父节点,左孩子节点,右孩子节点。前序遍历是先遍历父节点,之后左孩子节点,右孩子节点。中序和后序遍历都是针对父节点的,父节点中间遍历,父节点最后遍历。左右孩子节点的遍历顺序不变。

  1. 遍历节点 0。

  2. 遍历节点 0 的左孩子节点。

  3. 遍历节点 1 的左孩子节点。

  4. 遍历节点 1 的右孩子节点。

节点 0 的整个左孩子完成遍历,开始遍历节点 0 的右孩子节点。

  1. 遍历节点 0 的整个右孩子节点的根节点 2。

  2. 遍历节点 2 的整个左孩子节点,先遍历节点 5,然后节点 5 的左孩子节点 7,结束节点 2 的左孩子。

  3. 然后遍历节点 2 的右孩子。

遍历结果:0,1,3,4,2,5,7,6

3. 迭代实现前序遍历 (preorder)

前序遍历由两部分组成,一个循环遍历左孩子节点,另外一个将右孩子节点入栈。循环遍历左孩子节点,入栈右节点。弹出栈元素,回到循环遍历左孩子节点。

  1. 从根节点开始,遍历头结点的所有左孩子节点,直到最后一个。栈中存储两个右孩子节点,分别是 2,4。

  2. 将节点 4 弹出栈,输出节点 4。 (遍历到节点没有左孩子节点的时候,开始查看栈中是否有元素。栈中有元素则出栈,继续一直遍历左孩子节点,入栈右孩子节点。) 节点4 没有左孩子节点,也没有右孩子节点,不需要额外的操作。

  3. 弹出栈中元素 2,输出。将节点 2 的右孩子节点 6 放入栈中。

  4. 循环遍历节点 2 的左孩子节点 5,然后 7,直到左孩子节点为空。

  5. 弹出栈中元素 6 输出,6 无左右孩子节点,不做其他操作。栈为空,且 6 的左孩子节点为空,结束循环。

References

https://dsa.cs.tsinghua.edu.cn/~deng/ds/dsacpp/
https://www.programiz.com/dsa/tree-traversal
http://btechsmartclass.com/data_structures/binary-tree-traversals.html
https://me.csdn.net/fanfan199312

tree traversal (树的遍历) - preorder traversal (前序遍历)相关推荐

  1. 前序遍历 (preorder traversal) - 中序遍历 (inorder traversal) - 后序遍历 (postorder traversal)

    前序遍历 (preorder traversal) - 中序遍历 (inorder traversal) - 后序遍历 (postorder traversal) 1. 前序遍历 (preorder ...

  2. 二叉树的三种遍历方式:前序遍历、中序遍历和后序遍历

    二叉树的三种遍历方式:前序遍历.中序遍历和后序遍历 参考资料: 二叉树.前序遍历.中序遍历.后序遍历 - 蓝海人 - 博客园 (cnblogs.com) 二叉树 - LeetBook - 力扣(Lee ...

  3. 2018.7.28 二叉树的遍历规则(前序遍历、后序遍历、中序遍历)

    树的遍历顺序大体分为三种:前序遍历(先根遍历.先序遍历),中序遍历(中根遍历),后序遍历(后根遍历). 前序遍历:前序遍历可以记为根左右,若二叉树为空,则结束返回. 前序遍历的规则:(1)访问根节点( ...

  4. 二叉树的四种遍历方式(前序遍历、中序遍历、后序遍历、测层序遍历)

    一.二叉树的遍历 遍历是数据结构中的常见的操作,把所有元素都访问一遍. 线性数据结构的遍历比较简单 ①.正序遍历 ②.逆序遍历 根据节点访问顺序的不同,二叉树的常见遍历方式用四种 ①.前序遍历(Pre ...

  5. 【二叉树】二叉树的遍历规则(前序遍历、后序遍历、中序遍历)|前/后/中缀表达式...

    转自:https://www.cnblogs.com/turnips/p/5096578.html 今天看了一些关于平和查找二叉树的问题,顺便也复习了一下二叉树的遍历规则,写一下学习文档. 树的遍历顺 ...

  6. 二叉树的遍历规则(前序遍历、后序遍历、中序遍历)

    树的遍历顺序大体分为三种:前序遍历(先根遍历.先序遍历),中序遍历(中根遍历),后序遍历(后根遍历). 规则 前序遍历的规则: (1)访问根节点 (2)前序遍历左子树 (3)前序遍历右子树 中序遍历的 ...

  7. 【二叉树迭代版前序遍历】LeetCode 144. Binary Tree Preorder Traversal

    LeetCode 144. Binary Tree Preorder Traversal Solution1:递归版 二叉树的前序遍历递归版是很简单的,前序遍历的迭代版相对是最容易理解的. 迭代版链接 ...

  8. tree traversal (树的遍历) - postorder traversal (后序遍历)

    tree traversal (树的遍历) - postorder traversal (后序遍历) 1. tree traversal - 树的遍历 二叉树的遍历 (traversing binar ...

  9. tree traversal (树的遍历) - inorder traversal (中序遍历)

    tree traversal (树的遍历) - inorder traversal (中序遍历) 1. tree traversal - 树的遍历 二叉树的遍历 (traversing binary ...

最新文章

  1. 高级软件工程课程第二次作业
  2. Oracle apex 搭建
  3. Qt Creator创建自定义效果和材质
  4. jQuery的on绑定click和直接绑定click区别
  5. 苹果cms资源站360影视
  6. 带绿色箭头指示的滑动门DIV效果
  7. OPPO沈义人官宣Reno首批配色:雾海绿、薄雾粉、极夜黑、星云紫
  8. Windows Server 2008 R2正式版尝鲜体验
  9. 汇编语言典型例子详解_汇编语言例子_汇编语言 举例子
  10. 乘着创新的浪潮:协同运输机器人编队的基于模型的开发实施方案
  11. 大量的linux、H3C、cisco、华为、模拟器、adobe教程
  12. PHP高并发场景的三种解决方案
  13. RANSAC算法理解
  14. html播放监控视频教程,使用javascript实现监控视频播放并打印日志
  15. cascading--wordcount
  16. HDFS操作及命令介绍
  17. do_bootm 分析
  18. 计算机操作系统pv实验,计算机操作系统PV操作例题.doc
  19. 单页网站不会限制您的选择
  20. 回溯算法---过河问题(商人过河)

热门文章

  1. QT_OpenGL渲染总结
  2. 等效焦距和视场角计算
  3. 如何使用命令行合成一句话图片木马
  4. spritekit 动画_使用SpriteKit在Swift中创建动画
  5. html 向左箭头图标css,使用css实现箭头图标
  6. 22南工计算机学院新生培训最终章---ACM竞赛机制
  7. 乐乐的计算题目+题解
  8. bzoj3039 玉蟾宫
  9. 微信公众号-模板消息管理
  10. 读书笔记-财务报表资本结构分析