Python实现深度优先遍历和广度优先遍历
转载自:http://blog.csdn.net/bone_ace/article/details/46718683
python实现二叉树和它的七种遍历
介绍
树是数据结构中非常重要的一种,主要的用途是用来提高查找效率,对于要重复查找的情况效果更佳,如二叉排序树、FP-树。另外可以用来提高编码效率,如哈弗曼树。
代码
- 树的构造
- 递归实现前序遍历、中序遍历、后序遍历
- 栈实现前序遍历、中序遍历、后序遍历
- 队列实现广度优先遍历
#coding=utf-8class Node(object):"""节点类"""def __init__(self, elem=-1, lchild=None, rchild=None):self.elem = elemself.lchild = lchildself.rchild = rchildclass Tree(object):"""树类"""def __init__(self):self.root = Node()self.myQueue = []def add(self, elem):"""为树添加节点"""node = Node(elem)if self.root.elem == -1: # 如果树是空的,则对根节点赋值self.root = nodeself.myQueue.append(self.root)else:treeNode = self.myQueue[0] # 此结点的子树还没有齐。if treeNode.lchild == None:treeNode.lchild = nodeself.myQueue.append(treeNode.lchild)else:treeNode.rchild = nodeself.myQueue.append(treeNode.rchild)self.myQueue.pop(0) # 如果该结点存在右子树,将此结点丢弃。def front_digui(self, root):"""利用递归实现树的先序遍历"""if root == None:returnprint root.elem,self.front_digui(root.lchild)self.front_digui(root.rchild)def middle_digui(self, root):"""利用递归实现树的中序遍历"""if root == None:returnself.middle_digui(root.lchild)print root.elem,self.middle_digui(root.rchild)def later_digui(self, root):"""利用递归实现树的后序遍历"""if root == None:returnself.later_digui(root.lchild)self.later_digui(root.rchild)print root.elem,def front_stack(self, root):"""利用堆栈实现树的先序遍历"""if root == None:returnmyStack = []node = rootwhile node or myStack:while node: #从根节点开始,一直找它的左子树print node.elem,myStack.append(node)node = node.lchildnode = myStack.pop() #while结束表示当前节点node为空,即前一个节点没有左子树了node = node.rchild #开始查看它的右子树def middle_stack(self, root):"""利用堆栈实现树的中序遍历"""if root == None:returnmyStack = []node = rootwhile node or myStack:while node: #从根节点开始,一直找它的左子树myStack.append(node)node = node.lchildnode = myStack.pop() #while结束表示当前节点node为空,即前一个节点没有左子树了print node.elem,node = node.rchild #开始查看它的右子树def later_stack(self, root):"""利用堆栈实现树的后序遍历"""if root == None:returnmyStack1 = []myStack2 = []node = rootmyStack1.append(node)while myStack1: #这个while循环的功能是找出后序遍历的逆序,存在myStack2里面node = myStack1.pop()if node.lchild:myStack1.append(node.lchild)if node.rchild:myStack1.append(node.rchild)myStack2.append(node)while myStack2: #将myStack2中的元素出栈,即为后序遍历次序print myStack2.pop().elem,def level_queue(self, root):"""利用队列实现树的层次遍历"""if root == None:returnmyQueue = []node = rootmyQueue.append(node)while myQueue:node = myQueue.pop(0)print node.elem,if node.lchild != None:myQueue.append(node.lchild)if node.rchild != None:myQueue.append(node.rchild)if __name__ == '__main__':"""主函数"""elems = range(10) #生成十个数据作为树节点tree = Tree() #新建一个树对象for elem in elems: tree.add(elem) #逐个添加树的节点print '队列实现层次遍历:'tree.level_queue(tree.root)print '\n\n递归实现先序遍历:'tree.front_digui(tree.root)print '\n递归实现中序遍历:' tree.middle_digui(tree.root)print '\n递归实现后序遍历:'tree.later_digui(tree.root)print '\n\n堆栈实现先序遍历:'tree.front_stack(tree.root)print '\n堆栈实现中序遍历:'tree.middle_stack(tree.root)print '\n堆栈实现后序遍历:'tree.later_stack(tree.root)
总结
树的遍历主要有两种,一种是深度优先遍历,像前序、中序、后序;另一种是广度优先遍历,像层次遍历。在树结构中两者的区别还不是非常明显,但从树扩展到有向图,到无向图的时候,深度优先搜索和广度优先搜索的效率和作用还是有很大不同的。
深度优先一般用递归,广度优先一般用队列。一般情况下能用递归实现的算法大部分也能用堆栈来实现。
我印象中是有递归构造树的方法,却一直想不出该怎么构造。后来仔细想了一下,递归思想有点类似深度优先算法,而树的构造应该是广度优先的。如果用递归的话一定要有个终止条件,例如规定树深等。不然构造出来的树会偏向左单子树或者右单子树。所以一般树的构造还是应该用队列比较好。
Python实现深度优先遍历和广度优先遍历相关推荐
- 二叉树深度优先遍历和广度优先遍历
二叉树深度优先遍历和广度优先遍历
- 多级树的深度优先遍历与广度优先遍历(Java实现)
目录 多级树的深度优先遍历与广度优先遍历(Java实现) 节点模型 深度优先遍历 广度优先遍历 多级树的深度优先遍历与广度优先遍历(Java实现) 深度优先遍历与广度优先遍历其实是属于图算法的一种,多 ...
- 二叉树的深度优先遍历和广度优先遍历
二叉树是一种很重要的数据结构,对于二叉树的遍历,有深度优先遍历和广度优先遍历,深度优先遍历又有先序.中序.后续遍历,广度优先遍历就是按层遍历. 1. 深度优先遍历 深度优先遍历,也就是先序.中序.后续 ...
- 广度优先搜索生成树怎么画_图的深度优先遍历与广度优先遍历以及最小生成树...
图的深度优先遍历 题目:写出附从每个顶点出发的一次深度优先搜索遍历序列.在纸上画出遍历过程和序列,提交截图. 错误回答 从A点开始遍历:0124-01324-0134-0324-034 从B点开始遍历 ...
- 大话数据结构 17:图的深度优先遍历和广度优先遍历
深度优先遍历 主要思路是从图中一个未访问的顶点 V 开始,沿着一条路一直走到底,然后从这条路尽头的节点回退到上一个节点,再从另一条路开始走到底-,不断递归重复此过程,直到所有的顶点都遍历完成,它的特点 ...
- [js] 解释下深度优先遍历和广度优先遍历的区别及如何实现
[js] 解释下深度优先遍历和广度优先遍历的区别及如何实现 1.深度优先采用堆栈结构,先进后出,所占的空间较小,执行时间较长: 2.广度优先采用队列结构先进先出,所占空间较大,执行时间短,空间换时间: ...
- 图:图的邻接表创建、深度优先遍历和广度优先遍历代码实现
邻接表介绍 邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构比较较浪费存储空间.如果不想浪费存储空间,大家肯定会先到链表.需要空间的时候再才想内存去申请,同样适用于图 ...
- 图:图的邻接矩阵创建、深度优先遍历和广度优先遍历详解
邻接矩阵介绍 直接说,邻接矩阵是图的一种存储结构.那么图是什么呢?图是一种逻辑结构,和线性结构.树形结构.集合结构一样 是一种逻辑结构用来描述数据对象中的数据元素之间的关系.来看下图的定义:图(Gra ...
- 数据结构之图:邻接矩阵和邻接表、深度优先遍历和广度优先遍历
简介 线性表是一种线性结构,除了头结点和尾节点,线性表的每个元素都只有一个前取节点和一个后继节点.而树结构则相较于线性表更加复杂,它描述的关系为数据元素之间的父子关系,也是现实世界父子关系的缩影, 一 ...
- 数据结构—无向图创建邻接矩阵、深度优先遍历和广度优先遍历(C语言版)
无向图创建邻接矩阵.深度优先遍历和广度优先遍历 一.概念解析: (1)无向图: (2)邻接矩阵: 二.创建邻接矩阵: 三.深度遍历.广度遍历 (1)深度遍历概念: (2)广度遍历概念: 四.实例展示 ...
最新文章
- (翻译) MongoDB(2) 数据库和集合
- hydra mysql 爆破_Hydra(爆破神器)使用方法
- SparkMLlib回归算法之决策树
- 编码基本功:给刚刚学习编程的朋友的建议
- iPhone手机下载应用软件的区别(itunes,i4和itools)
- 服务器显示A40故障码,求助大神,车子出现故障码,5053无法消除
- 操作系统原理课程 期末考试复习重点
- HttpUtil工具示例(GET、POST请求)IP工具根据token获取用户信息工具
- LittleVGL v7.5.0在STM32F103x上的移植
- mysql(zip版)下载安装教程
- Springboot集成百度地图实现定位打卡功能
- 使用pycallgraph分析python代码函数调用流程以及框架
- 通过UA区分微信PC端浏览器还是手机端浏览器
- python输入数学表达式并求值_Python 条件表达式求值
- 北大考研复试上机——W's Cipher
- 计算机中丟失Slc.dll,调试符号不会加载slc.dll和sppc.dll
- 汽车早讯丨庞大集团董事长回应高管降薪;一嗨租车达成新私有化协议
- 【unity3D】 分享学习路上的一些坑(一)——商店导入的模型人物站上去看起来是飘着的;
- 如何把安卓系统刷成linux,废旧Android手机如何改造成Linux服务器?
- Android kotlin实战之协程suspend详解与使用
热门文章
- 如何设计数据可视化平台
- 如何在应用交付上发布应用_面对应用交付中的新建与购买问题
- python(6):条件语句和循环语句 + 三元表达式
- 快速配置 Samba 将 Linux 目录映射为 Windows 驱动器,用于跨平台编程
- 如何禁用烦人的“insert”键
- 世纪前线网络质量测试工具 是什么_【案例分享】利用手持式测试工具对建筑控制系统快速排障的方法...
- CAD中PDF怎么转DWG
- Redis之发布与订阅
- 什么是软件测评?怎样选择软件测评机构
- zynq 的uart(ps)