遍历方案    从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:

1).访问结点本身(N)

2).遍历该结点的左子树(L)

3).遍历该结点的右子树(R)

有次序:    NLR、LNR、LRN

遍历的命名

根据访问结点操作发生位置命名:

NLR:前序遍历(PreorderTraversal亦称(先序遍历))  ——访问结点的操作发生在遍历其左右子树之前。

LNR:中序遍历(InorderTraversal)  ——访问结点的操作发生在遍历其左右子树之中(间)。

LRN:后序遍历(PostorderTraversal)    ——访问结点的操作发生在遍历其左右子树之后。

注:由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtlee)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。

遍历算法

1).先序遍历的递归算法定义:

若二叉树非空,则依次执行如下操作:

a.访问根结点

b.遍历左子树

c.遍历右子树

2).中序遍历的递归算法定义:

若二叉树非空,则依次执行如下操作:

a.遍历左子树

b.访问根结点

c.遍历右子树

3).后序遍历得递归算法定义:

若二叉树非空,则依次执行如下操作:

a.遍历左子树

b.遍历右子树

c.访问根结点

一、二叉树的递归遍历:

#-*- coding: utf - 8 - *-

classTreeNode(object):def __init__(self, left=0, right=0, data=0):

self.left=left

self.right=right

self.data=dataclassBTree(object):def __init__(self, root=0):

self.root=rootdefis_empty(self):if self.root is0:returnTrueelse:returnFalsedefpreorder(self, treenode):'前序(pre-order,NLR)遍历'

if treenode is0:return

print(treenode.data)

self.preorder(treenode.left)

self.preorder(treenode.right)definorder(self, treenode):'中序(in-order,LNR'

if treenode is0:returnself.inorder(treenode.left)print(treenode.data)

self.inorder(treenode.right)defpostorder(self, treenode):'后序(post-order,LRN)遍历'

if treenode is0:returnself.postorder(treenode.left)

self.postorder(treenode.right)print(treenode.data)

node1= TreeNode(data=1)

node2= TreeNode(node1, 0, 2)

node3= TreeNode(data=3)

node4= TreeNode(data=4)

node5= TreeNode(node3, node4, 5)

node6= TreeNode(node2, node5, 6)

node7= TreeNode(node6, 0, 7)

node8= TreeNode(data=8)

root= TreeNode(node7, node8, 'root')

bt=BTree(root)print(u'''#生成的二叉树

# ------------------------

# root

# 7 8

# 6

# 2 5

# 1 3 4

#

# -------------------------''')print('前序(pre-order,NLR)遍历 :\n')

bt.preorder(bt.root)print('中序(in-order,LNR) 遍历 :\n')

bt.inorder(bt.root)print('后序(post-order,LRN)遍历 :\n')

bt.postorder(bt.root)

输出:

#生成的二叉树

#------------------------#root#7 8#6#2 5#1 3 4#

#-------------------------

前序(pre-order,NLR)遍历 :

root7

6

2

1

5

3

4

8中序(in-order,LNR) 遍历 :1

2

6

3

5

4

7root8后序(post-order,LRN)遍历 :1

2

3

4

5

6

7

8root

二、.二叉树的非递归遍历

下面就用非递归的方式实现一遍。主要用到了 stack 和 queue维护一些数据节点:

#-*- coding: utf - 8 - *-

classTreeNode(object):def __init__(self, left=0, right=0, data=0):

self.left=left

self.right=right

self.data=dataclassBTree(object):def __init__(self, root=0):

self.root=rootdefis_empty(self):if self.root is0:returnTrueelse:returnFalsedefpreorder(self, treenode):'前序(pre-order,NLR)遍历'stack=[]while treenode orstack:if treenode is not0:print(treenode.data)

stack.append(treenode)

treenode=treenode.leftelse:

treenode=stack.pop()

treenode=treenode.rightdefinorder(self, treenode):'中序(in-order,LNR) 遍历'stack=[]while treenode orstack:iftreenode:

stack.append(treenode)

treenode=treenode.leftelse:

treenode=stack.pop()print(treenode.data)

treenode=treenode.right#def postorder(self, treenode):

#stack = []

#pre = 0

#while treenode or stack:

#if treenode:

#stack.append(treenode)

#treenode = treenode.left

#elif stack[-1].right != pre:

#treenode = stack[-1].right

#pre = 0

#else:

#pre = stack.pop()

#print pre.data

defpostorder(self, treenode):'后序(post-order,LRN)遍历'stack=[]

queue=[]

queue.append(treenode)whilequeue:

treenode=queue.pop()iftreenode.left:

queue.append(treenode.left)iftreenode.right:

queue.append(treenode.right)

stack.append(treenode)whilestack:print(stack.pop().data)deflevelorder(self, treenode):from collections importdequeif nottreenode:returnq=deque([treenode])whileq:

treenode=q.popleft()print(treenode.data)iftreenode.left:

q.append(treenode.left)iftreenode.right:

q.append(treenode.right)

node1= TreeNode(data=1)

node2= TreeNode(node1, 0, 2)

node3= TreeNode(data=3)

node4= TreeNode(data=4)

node5= TreeNode(node3, node4, 5)

node6= TreeNode(node2, node5, 6)

node7= TreeNode(node6, 0, 7)

node8= TreeNode(data=8)

root= TreeNode(node7, node8, 'root')

bt=BTree(root)print(u'''#生成的二叉树

# ------------------------

# root

# 7 8

# 6

# 2 5

# 1 3 4

#

# -------------------------''')print('前序(pre-order,NLR)遍历 :\n')

bt.preorder(bt.root)print('中序(in-order,LNR) 遍历 :\n')

bt.inorder(bt.root)print('后序(post-order,LRN)遍历 :\n')

bt.postorder(bt.root)print('层序(level-order,LRN)遍历 :\n')

bt.levelorder(bt.root)

输出:

#生成的二叉树

#------------------------#root#7 8#6#2 5#1 3 4#

#-------------------------

前序(pre-order,NLR)遍历 :

root7

6

2

1

5

3

4

8中序(in-order,LNR) 遍历 :1

2

6

3

5

4

7root8后序(post-order,LRN)遍历 :1

2

3

4

5

6

7

8root

层序(level-order,LRN)遍历 :

root7

8

6

2

5

1

3

4

python二叉树遍历例子_python数据结构之二叉树的遍历实例相关推荐

  1. python for循环例子_Python for循环生成列表的实例

    Python for循环生成列表的实例 一般Python for语句前不加语句,但我在机器学习实战中看到了这两条语句: featList = [example[i] for example in da ...

  2. python数据结构 树_python数据结构之二叉树的建立实例

    先建立二叉树节点,有一个data数据域,left,right 两个指针域 复制代码 代码如下: # -*- coding: utf - 8 - *- class TreeNode(object): d ...

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

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

  4. python创建链表实例_python数据结构链表之单向链表(实例讲解)

    python数据结构链表之单向链表(实例讲解) 单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域.这个链接指向链表中的下一个节点,而最后 ...

  5. python数据结构 树_python数据结构之二叉树的统计与转换实例

    一.获取二叉树的深度 就是二叉树最后的层次,如下图: 实现代码: 代码如下: def getheight(self): "' 获取二叉树深度 "' return self.__ge ...

  6. python遍历树结构_python 数据结构与算法——树的遍历

    1.广度优先遍历 2.深度优先遍历 先序遍历:把根放在最前面 中序遍历:把根放在中间 后序遍历:把根放在后面 # -*- coding: utf-8 -*- """ Cr ...

  7. python迭代函数例题_python map 函数使用,遍历访问可迭代对象

    1. 功能介绍 map 调用函数遍历可迭代对象,返回一个迭代器对象 map(function, iterable, ...) 可以传递多个迭代器对象给 map 的迭代函数,这个函数接收参数的个数必须和 ...

  8. python递归编程题_Python数据结构与算法41:递归编程练习题4:铺瓷砖

    注:本文如涉及到代码,均经过Python 3.7实际运行检验,保证其严谨性. 本文阅读时间约为8分钟. 递归编程练习题4:铺瓷砖 给定一个长度为N的区域,及4种不同长度的瓷砖:灰瓷砖(长为1格).红瓷 ...

  9. python链表值讲解_python数据结构之链表详解

    python数据结构之链表详解 数据结构是计算机科学必须掌握的一门学问,之前很多的教材都是用C语言实现链表,因为c有指针,可以很方便的控制内存,很方便就实现链表,其他的语言,则没那么方便,有很多都是用 ...

最新文章

  1. 在北京做Java开发如何月薪达到两万,需要技术水平达到什么程度?
  2. java包(翻译自Java Tutorials)
  3. ExtJs_关于combobox的那些分页二三事
  4. 数据库acid简介(一)
  5. 连接MySQL的10060错误:Can't connect to MySQL server on '*.*.*.*'(10060)
  6. Go语言中字符串的查找方法小结
  7. EOS资源模型(1)资源说明
  8. XML——XML的那些事
  9. java nio ByteBuffer的使用
  10. ApacheCN 活动汇总 2019.8.23
  11. 利用osgEarth在画国界线时报错“Crop failed - GEOS not available”
  12. Html设置图片大小代码
  13. Representation Learning with Contrastive Predictive Coding 论文阅读
  14. HTML+CSS项目总结(建议学习三周后)
  15. 电视剧《奋斗》精彩对白节选---(三)
  16. 麦卡锡问答:什么是人工智能?
  17. 系统集成项目管理工程师10大管理47个过程域输入输出工具(项目质量管理)
  18. 程序员千万别找太漂亮的女生做女朋友
  19. 人力资源管理的六大模块
  20. java计算机毕业设计基于安卓Android的装维助手APP

热门文章

  1. java生产消费线程小例子
  2. log4j使用方法--视频地址: http://www.letv.com/ptv/pplay/11475
  3. Oracle统计产生日志数据增长增量
  4. linux 脚本 格式化,Formatting Long Lines 格式化多行字符的shell脚本
  5. 使用MybatisPlus在实体中添加数据库表中不存在的字段
  6. maven配置aliyun仓库地址
  7. mysql net 指令_MySQL命令
  8. linux命令逻辑运算:与、或、非、异或
  9. android 电话拨号器
  10. java 实现二分法