之前刷leetcode的时候,知道求排列组合都需要深度优先搜索(DFS), 那么前序、中序、后序遍历是什么鬼,一直傻傻的分不清楚。直到后来才知道,原来它们只是DFS的三种不同策略。

N = Node(节点)

L = Left(左节点)

R = Right(右节点)

在深度优先搜索的时候,以Node的访问顺序,定义了三种不同的搜索策略:

前序遍历:结点 —> 左子树 —> 右子树

中序遍历:左子树—> 结点 —> 右子树

后序遍历:左子树 —> 右子树 —> 结点

##前序遍历

Pre-order: F, B, A, D, C, E, G, I, H.

##中序遍历

In-order: A, B, C, D, E, F, G, H, I.

在二叉搜索树(BST)中,中序遍历返回递增的一个序列

##后序遍历

Post-order: A, C, E, D, B, H, I, G, F.

##递归代码

递归实现比较直观容易,通常DFS遍历,都需要传递一个参数 or 设置一个全局变量,来保存结果

def pre_order(self, node, results):
if node is None:
return
results.append(node.val)
self.pre_order(node.left, results)
self.pre_order(node.right, results)
def in_order(self, node, results):
if node is None:
return
self.in_order(node.left, results)
results.append(node.val)
self.in_order(node.right, results)
def post_order(self, node, results):
if node is None:
return
self.post_order(node.left, results)
self.post_order(node.right, results)
results.append(node. 大专栏  树的三种DFS策略(前序、中序、后序)遍历val)

##非递归代码

深度优先遍历的非递归代码,一定用到的是stack数据接口

非递归实现前序和中序还可以,后续遍历就非常烧脑了

前序最简单,相当于for循环所有children,所以一版非递归DFS,就用前序就好了。

中序遍历,由于对于BST有一个递增的特性,所以还是比较常用的

def preorderTraversal(self, root):
results = []
if root is None:
return results
stack = [root]
while(len(stack) > 0):
node = stack.pop()
results.append(node.val)
# right first so left pop fisrt
if node.right is not None:
stack.append(node.right)
if node.left is not None:
stack.append(node.left)
return results
def inorderTraversal(self, root):
results = []
if root is None:
return results
stack = []
node = root
while(len(stack) > 0 or node is not None):
if (node is not None):
stack.append(node)
node = node.left
else:
node = stack.pop()
results.append(node.val)
node = node.right
return results
def postorderTraversal(self, root):
results = []
if root is None:
return results
node = root
stack = []
lastNodeVisted = None
while(len(stack) > 0 or node is not None):
if node is not None:
stack.append(node)
node = node.left
else:
peek = stack[-1] # last element
if (peek.right is not None and lastNodeVisted != peek.right):
node = peek.right
else:
results.append(peek.val)
lastNodeVisted = stack.pop()
return results

–END–

树的三种DFS策略(前序、中序、后序)遍历的更多相关文章

  1. java:数据结构(四)二叉查找树以及树的三种遍历

    @TOC 二叉树模型 二叉树是树的一种应用,一个节点可以有两个孩子:左孩子,右孩子,并且除了根节点以外每个节点都有一个父节点.当然这种简单的二叉树不能解决让树保持平衡状态,例如你一直往树的左边添加元素 ...

  2. 三种java 去掉字符串中的重复字符函数

    三种java 去掉字符串中的重复字符函数 public static void main(string[] args) { system.out.println(removerepeatedchar( ...

  3. 算法进阶面试题03——构造数组的MaxTree、最大子矩阵的大小、2017京东环形烽火台问题、介绍Morris遍历并实现前序/中序/后序

    接着第二课的内容和带点第三课的内容. (回顾)准备一个栈,从大到小排列,具体参考上一课.... 构造数组的MaxTree [题目] 定义二叉树如下: public class Node{ public ...

  4. 前序+中序->后序 中序+后序->前序

    前序+中序->后序 #include <bits/stdc++.h> using namespace std; struct node { char elem; node* l; n ...

  5. SDUT-2804_数据结构实验之二叉树八:(中序后序)求二叉树的深度

    数据结构实验之二叉树八:(中序后序)求二叉树的深度 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 已知一颗二叉树的中序 ...

  6. 二叉树 遍历 先序 中序 后序 深度 广度 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  7. SDUT OJ 数据结构实验之二叉树八:(中序后序)求二叉树的深度

    数据结构实验之二叉树八:(中序后序)求二叉树的深度 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...

  8. 给出 中序&后序 序列 建树;给出 先序&中序 序列 建树

    已知 中序&后序  建立二叉树: SDUT 1489 Description  已知一棵二叉树的中序遍历和后序遍历,求二叉树的先序遍历 Input  输入数据有多组,第一行是一个整数t (t& ...

  9. 【C&数据结构】---关于链表结构的前序插入和后序插入

    刷LeetCode题目,需要用到链表的知识,忽然发现自己对于链表的插入已经忘得差不多了,以前总觉得理解了记住了,但是发现真的好记性不如烂笔头,每一次得学习没有总结输出,基本等于没有学习.连复盘得机会都 ...

随机推荐

  1. ubuntu下安裝程序的三個方式

    引言 在ubuntu当中,安装应用程序我所知道的有三种方法,分别是apt-get,dpkg安装deb和make install安装源码包三种.下面针对每一种方法各举例来说明. apt-get方法 使用 ...

  2. SpringBoot项目启动之前操作,启动之后操作

    1.在Bean对象初始化之前可以做的操作 @Component public class InitBean implements BeanDefinitionRegistryPostProcessor ...

  3. 关于 Xpath 定位

    关于 Xpath 定位 问: // 和 / 的区别 表达式 描述 nodename 选取此节点的所有子节点. / 从根节点选取. // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置. . ...

  4. $.proxy和$.extend

    $.proxy用法详解 参考:https://www.cnblogs.com/alice626/p/6004864.html jQuery中的$.proxy官方描述为: 描述:接受一个函数,然后返回一 ...

  5. Sqlite教程(4) Activity

    之前我们已经有了DbHelper.Data Access Object.Configuration. 那麽现在就是由Activity去创建它们,然後就可以存取Sqlite. 架构图表示了它们的关系. ...

  6. Form表单中method="post/get'的区别

    Form提供了两种数据传输的方式--get和post.虽然它们都是数据的提交方式,但是在实际传输时确有很大的不同,并且可能会对数据产生严重的影响.虽然为了方便的得到变量值,Web容器已经屏蔽了二者的一 ...

  7. 分享几个4412开发板新录制的视频,不是VIP也能看

    如果能点个赞就更好啦 iTOP4412开发板介绍https://www.bilibili.com/video/av74453392 iTOP4412开发板系统编程前言https://www.bilib ...

  8. python三目运算和递归的小练习

    应用前: ''' 递归的简单实现,输出i = 5的时候的结果 ''' def diGui(i = 0): i = i +1 if i >=5: return ("{0}大于等于5&qu ...

  9. 5.redis主从配置

    Redis的主从复制 1.什么是主从复制 持久化保证了即使redis服务重启也不会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损坏了可能会导致数据 ...

  10. Ubuntu 12.04 编译bcm93349dcm软件包

    1.准备工作操作系统:Ubuntu 12.04 获取bcm93349dcm软件包: bootloader源代码:Bootloader_2_2_0.zip CM源代码:ProdD20_BFC4.4.10 ...