2019/12/20—字节的面试官这么和蔼,对我这么友善,我还连非递归实现这种基础题都做不上来,真是活该吃土诶。狠狠地记下一笔。

本文介绍二叉树的前序、中序、后序遍历的递归和非递归算法(python代码)。

一、预备工作

概念温习

前序遍历:根节点 -- 左节点 -- 右节点
中序遍历:左节点 -- 根节点 -- 右节点
后序遍历:左节点 -- 右节点 -- 根节点
实际上就是根节点的前中后序

节点类

class Node(object):"""节点类"""def __init__(self, value=None, left=None, right=None):self.value = valueself.left = leftself.right = right

二、递归实现

递归实现很简单。直接递归完事。

# 先序打印二叉树(递归)
def preOrder(node):if not node:return Noneprint(node.value)preOrder(node.left)preOrder(node.right)# 中序打印二叉树(递归)
def inOrder(node):if not node:return NoneinOrder(node.left)print(node.value)inOrder(node.right)# 后序打印二叉树(递归)
def postOrder(node):if not node:return NonepostOrder(node.left)postOrder(node.right)print(node.value)

三、非递归实现

非递归的实现主要借助:栈+循环。栈用来存储遍历时进行操作的结点,循环用来代替递归(通常递归的替代方式都是用循环)

前序遍历

def 

中序遍历

中序遍历和前序遍历大体一样,只需要把输出的位置output.append调整下即可

def inOrder(node):stack = []output = []while node or stack:while node:stack.append(node)node = node.lefttem = stack.pop()output.append(tem.value)   # 中序遍历在左节点为空时输出根节点node = tem.rightreturn output

后序遍历

后序遍历较前两者都不同,因为后序遍历在遍历左节点后就需要遍历右节点,最后再输出根节点,在栈中,每次回退后还需检查右节点,不能直接将根节点出栈。

这里的思路是利用两个栈stack和stack2,stack将每次需要遍历的结点按"左-右-根(此时的右便是下一个出栈的根结点)"的顺序入栈结点,stack2反过来按照"根-右-左“的顺序存储stack出栈的结点

这样最后得到的stack2便是按照"根-右-左"的遍历顺序存储的。将其所有元素出栈或者将其逆置,便得到我们想要的后序遍历:左-右-根。

def postOrder(node):if not node:           # 不能放在循环中判断,因为len([None])=1return []stack = [node]stack2 = []while len(stack) > 0:node = stack.pop()stack2.append(node.value)if node.left:stack.append(node.left)if node.right:stack.append(node.right)return stack2[::-1]

四、不能实践的理论都是耍流氓

我们来测试下。随便举个栗子。建立如下所示的二叉树:

创建节点树代码:

class Node(object):"""节点类"""def __init__(self, value=None, left=None, right=None):self.value = valueself.left = leftself.right = rightg = Node(7)
f = Node(6)
e = Node(5,None,g)
d = Node(4)
c = Node(3,e,f)
b = Node(2,d)
a = Node(1,b,c)

验证:

print(preOrder(a))
print(inOrder(a))
print(postOrder(a))输出:
......
[1, 2, 4, 3, 5, 7, 6]
[4, 2, 1, 5, 7, 3, 6]
[4, 2, 7, 5, 6, 3, 1]Process finished with exit code 0

c 打印二叉树_二叉树遍历(非递归和递归实现)相关推荐

  1. 二叉树后序遍历(非递归)

    原文地址为: 二叉树后序遍历(非递归) 二叉树的递归遍历算法就不用说了:在非递归算法中,后序遍历难度大,很多书上只给出思想或者几段无法直接调试的代码,甚至有些书上是错的,当时我在研究的过程中,就是按着 ...

  2. 二叉树后序遍历_二叉树后序遍历非递归实现

    二叉树的后序遍历非递归实现是三种遍历实现里面最复杂的一种了. 后序遍历的顺序是左节点-右节点-根节点,因为二叉树每个节点只有指向子节点的指针而没有指向父节点的指针,因此我们需要一个额外的变量来记录是否 ...

  3. 树 (二叉树)--- (内含树(二叉树)的概念、二叉树性质、遍历(非递归)、习题)永不过时的数据结构

    树的定义: 树是一种非线性的数据结构,它是由有限个(n>=0)节点组成一个具有层次关系的集合. 树最顶端的顶点称为根节点,根节点没有前期节点.(如下A点就被称为根节点) 子树就是整一颗树的其中一 ...

  4. 二叉树先序遍历非递归遍历算法

    /*二叉树的先序遍历非递归算法目标遍历的二叉树:1/ \2 4/ \3 5 待输出结果为1,2,3,5,41.首先得用上面定义的结构体把这颗树表示出来2.表示出这颗树后在调用二叉树的先序遍历非递归算法 ...

  5. 先序abdfcegh 中序bfdagehc 后序线索二叉树_二叉树的遍历(先序、中序、后序、层序)...

    #include<iostream> #include<stack> #include<queue> //节点结构体 struct Node{int value;N ...

  6. 二叉树中序遍历非递归算法实现详解

    二叉树是数据结构中的经典结构,也是应用很广泛的结构之一.二叉树具有一些特定的性质,如 n0 = n2+1,在一些应用中,常常要求在树中查找具有某些特征的节点,或者对树中节点进行处理,即遍历二叉树的问题 ...

  7. 二叉树中序遍历线索化 C++ 递归实现

    二叉树中序遍历线索化 中序遍历有一个特点,只要不是叶子节点,遍历的时候左孩子一定是当前节点的上一个访问节点:右孩子一定是当前节点的下一个访问节点. 如果把叶子节点的左右孩子都利用起来,把空的左孩子做成 ...

  8. C++实现二叉树中序遍历非递归算法

    /*二叉树的中序遍历非递归算法目标遍历的二叉树:1/ \2 4/ \3 5 待输出结果为3,2,5,1,41.首先得用上面定义的结构体把这颗树表示出来2.表示出这颗树后在调用二叉树的中序遍历非递归算法 ...

  9. c++根据二叉树的层次遍历建立二叉树_二叉树-层次遍历(C++)

    Today,叨叨Chen继续给大家分享算法啦.层次遍历二叉树是大家再熟悉不过的二叉树操作了,看到这个算法通常会联想到队列,没错,叨叨Chen设计的层次遍历算法也是用到了队列(先进先出),下面一起进入算 ...

  10. 二叉树遍历结果推二叉树_二叉树遍历(PreOrder,InOrder,PostOrder)

    二叉树遍历结果推二叉树 In this article, we shall look into how we can perform a Binary Tree Traversal using dif ...

最新文章

  1. Python | 安装Jupyter Notebook及其目录的更改 jupyter问题
  2. LCD编程_LCD控制器
  3. 【Python】青少年蓝桥杯_每日一题_6.19_画风车
  4. saleor设置braintree支付方式
  5. Linux cpuidle framework
  6. 两款404页面自动跳转源码html
  7. 杂谈---如果你是面试官,你希望你未来的同事具有哪些能力呢?
  8. 漫画丨让你专心干技术,没让你干到35岁啊…
  9. SoundMorph Dust for Mac(双耳环绕音频颗粒合成仪)
  10. mysql2008完全卸载教程_完美卸载SQL Server 2008的方法
  11. Android中的PackageManager
  12. “人在囧途”今年少有的国产好电影
  13. wx:key的使用及wx:key的值
  14. 各种电脑/软件/生活/音乐/动漫/电影技巧汇总,你肯定能发现你需要的使用技巧,你的生活绝对会因此简化很多,具体操作见本专栏相关文章或点击链接
  15. 【ICPC 2018 Malaysia】UPC-9302 ELI'S CURIOUS MIND(递推)
  16. 《Windows 程序设计(第3版)》——6.7 【实例】窗口查看器
  17. 怎么修改我的世界服务器封面,《我的世界:初识服务器》
  18. 液冷数据中心如何构建,蓝海大脑液冷技术保驾护航
  19. 序列化Serialize
  20. 2014ACM亚洲区域北京邀请赛总结

热门文章

  1. css3-d ,动画,圆角
  2. webots自学笔记(五)使用物理插件ODE建立铰链
  3. web sevice 生成代理类及使用
  4. 阿里云数据盘分区并挂载
  5. HTK在win7下安装的一些问题
  6. 最近架设的MUNIN,WEBALIZER,AWSTATS截图存档
  7. [转帖]Android Bitmap内存限制OOM,Out Of Memory
  8. 荣耀30s刷鸿蒙,荣耀终于放出大招!4部荣耀旗舰可升级鸿蒙,网友:终于等到了...
  9. SpringCloud之Ribbon源码分析(一)
  10. 分布式事务各方案对比分析