python二叉树遍历例子_python数据结构之二叉树的遍历实例
遍历方案 从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:
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数据结构之二叉树的遍历实例相关推荐
- python for循环例子_Python for循环生成列表的实例
Python for循环生成列表的实例 一般Python for语句前不加语句,但我在机器学习实战中看到了这两条语句: featList = [example[i] for example in da ...
- python数据结构 树_python数据结构之二叉树的建立实例
先建立二叉树节点,有一个data数据域,left,right 两个指针域 复制代码 代码如下: # -*- coding: utf - 8 - *- class TreeNode(object): d ...
- c++ 删除二叉树的子树_数据结构—树|二叉树|前序遍历、中序遍历、后序遍历【图解实现】...
点击蓝字关注我们 AI研习图书馆,发现不一样的精彩世界 数据 结构 二叉树的遍历 一.树 在谈二叉树的知识点之前,我们首先来看一下树和图的基本概念.树:不包含回路的连通无向图,树是一种简单的非线性结构 ...
- python创建链表实例_python数据结构链表之单向链表(实例讲解)
python数据结构链表之单向链表(实例讲解) 单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域.这个链接指向链表中的下一个节点,而最后 ...
- python数据结构 树_python数据结构之二叉树的统计与转换实例
一.获取二叉树的深度 就是二叉树最后的层次,如下图: 实现代码: 代码如下: def getheight(self): "' 获取二叉树深度 "' return self.__ge ...
- python遍历树结构_python 数据结构与算法——树的遍历
1.广度优先遍历 2.深度优先遍历 先序遍历:把根放在最前面 中序遍历:把根放在中间 后序遍历:把根放在后面 # -*- coding: utf-8 -*- """ Cr ...
- python迭代函数例题_python map 函数使用,遍历访问可迭代对象
1. 功能介绍 map 调用函数遍历可迭代对象,返回一个迭代器对象 map(function, iterable, ...) 可以传递多个迭代器对象给 map 的迭代函数,这个函数接收参数的个数必须和 ...
- python递归编程题_Python数据结构与算法41:递归编程练习题4:铺瓷砖
注:本文如涉及到代码,均经过Python 3.7实际运行检验,保证其严谨性. 本文阅读时间约为8分钟. 递归编程练习题4:铺瓷砖 给定一个长度为N的区域,及4种不同长度的瓷砖:灰瓷砖(长为1格).红瓷 ...
- python链表值讲解_python数据结构之链表详解
python数据结构之链表详解 数据结构是计算机科学必须掌握的一门学问,之前很多的教材都是用C语言实现链表,因为c有指针,可以很方便的控制内存,很方便就实现链表,其他的语言,则没那么方便,有很多都是用 ...
最新文章
- 在北京做Java开发如何月薪达到两万,需要技术水平达到什么程度?
- java包(翻译自Java Tutorials)
- ExtJs_关于combobox的那些分页二三事
- 数据库acid简介(一)
- 连接MySQL的10060错误:Can't connect to MySQL server on '*.*.*.*'(10060)
- Go语言中字符串的查找方法小结
- EOS资源模型(1)资源说明
- XML——XML的那些事
- java nio ByteBuffer的使用
- ApacheCN 活动汇总 2019.8.23
- 利用osgEarth在画国界线时报错“Crop failed - GEOS not available”
- Html设置图片大小代码
- Representation Learning with Contrastive Predictive Coding 论文阅读
- HTML+CSS项目总结(建议学习三周后)
- 电视剧《奋斗》精彩对白节选---(三)
- 麦卡锡问答:什么是人工智能?
- 系统集成项目管理工程师10大管理47个过程域输入输出工具(项目质量管理)
- 程序员千万别找太漂亮的女生做女朋友
- 人力资源管理的六大模块
- java计算机毕业设计基于安卓Android的装维助手APP
热门文章
- java生产消费线程小例子
- log4j使用方法--视频地址: http://www.letv.com/ptv/pplay/11475
- Oracle统计产生日志数据增长增量
- linux 脚本 格式化,Formatting Long Lines 格式化多行字符的shell脚本
- 使用MybatisPlus在实体中添加数据库表中不存在的字段
- maven配置aliyun仓库地址
- mysql net 指令_MySQL命令
- linux命令逻辑运算:与、或、非、异或
- android 电话拨号器
- java 实现二分法