转载自: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实现深度优先遍历和广度优先遍历相关推荐

  1. 二叉树深度优先遍历和广度优先遍历

    二叉树深度优先遍历和广度优先遍历

  2. 多级树的深度优先遍历与广度优先遍历(Java实现)

    目录 多级树的深度优先遍历与广度优先遍历(Java实现) 节点模型 深度优先遍历 广度优先遍历 多级树的深度优先遍历与广度优先遍历(Java实现) 深度优先遍历与广度优先遍历其实是属于图算法的一种,多 ...

  3. 二叉树的深度优先遍历和广度优先遍历

    二叉树是一种很重要的数据结构,对于二叉树的遍历,有深度优先遍历和广度优先遍历,深度优先遍历又有先序.中序.后续遍历,广度优先遍历就是按层遍历. 1. 深度优先遍历 深度优先遍历,也就是先序.中序.后续 ...

  4. 广度优先搜索生成树怎么画_图的深度优先遍历与广度优先遍历以及最小生成树...

    图的深度优先遍历 题目:写出附从每个顶点出发的一次深度优先搜索遍历序列.在纸上画出遍历过程和序列,提交截图. 错误回答 从A点开始遍历:0124-01324-0134-0324-034 从B点开始遍历 ...

  5. 大话数据结构 17:图的深度优先遍历和广度优先遍历

    深度优先遍历 主要思路是从图中一个未访问的顶点 V 开始,沿着一条路一直走到底,然后从这条路尽头的节点回退到上一个节点,再从另一条路开始走到底-,不断递归重复此过程,直到所有的顶点都遍历完成,它的特点 ...

  6. [js] 解释下深度优先遍历和广度优先遍历的区别及如何实现

    [js] 解释下深度优先遍历和广度优先遍历的区别及如何实现 1.深度优先采用堆栈结构,先进后出,所占的空间较小,执行时间较长: 2.广度优先采用队列结构先进先出,所占空间较大,执行时间短,空间换时间: ...

  7. 图:图的邻接表创建、深度优先遍历和广度优先遍历代码实现

    邻接表介绍 邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构比较较浪费存储空间.如果不想浪费存储空间,大家肯定会先到链表.需要空间的时候再才想内存去申请,同样适用于图 ...

  8. 图:图的邻接矩阵创建、深度优先遍历和广度优先遍历详解

    邻接矩阵介绍 直接说,邻接矩阵是图的一种存储结构.那么图是什么呢?图是一种逻辑结构,和线性结构.树形结构.集合结构一样 是一种逻辑结构用来描述数据对象中的数据元素之间的关系.来看下图的定义:图(Gra ...

  9. 数据结构之图:邻接矩阵和邻接表、深度优先遍历和广度优先遍历

    简介 线性表是一种线性结构,除了头结点和尾节点,线性表的每个元素都只有一个前取节点和一个后继节点.而树结构则相较于线性表更加复杂,它描述的关系为数据元素之间的父子关系,也是现实世界父子关系的缩影, 一 ...

  10. 数据结构—无向图创建邻接矩阵、深度优先遍历和广度优先遍历(C语言版)

    无向图创建邻接矩阵.深度优先遍历和广度优先遍历 一.概念解析: (1)无向图: (2)邻接矩阵: 二.创建邻接矩阵: 三.深度遍历.广度遍历 (1)深度遍历概念: (2)广度遍历概念: 四.实例展示 ...

最新文章

  1. C#正则提取HTML中img的url值
  2. 彻底理解Spring AOP
  3. 灰色预测模型matlab_Matlab数据分析,2020研究生报名人数灰色预测
  4. ubuntu系统使用光盘/ISO镜像作为apt-get更新源
  5. 认识接口(Interface)设计
  6. 自动控制原理8.3---相平面法
  7. html5按钮组水平均分,ichart.js绘制虚线、平均分虚线效果的实现代码_javascript技巧...
  8. matlab 画x a的直线方程式,matlab画如x=a和y=b这种水平线和垂线的命令是什么,谢谢...
  9. 天地图显示不全的问题
  10. 浏览器播放rtsp视频流解决方案
  11. Codeforces1221 C. Perfect Team
  12. JAVA简易五子棋游戏
  13. js正则表达式验证字符串只包括大小写字母下划线和-
  14. 智能家居,在互联中看见全屋智能
  15. Mac OS X系统下修改wifi共享的默认网段
  16. Http 400错误重现实验及解决办法
  17. python实现指纹识别毕业论文_(完整版)指纹识别系统本科毕业论文
  18. 用蚁群算法求解TSP问题
  19. 复现《nature communications》图表(一):一模一样的Figure1
  20. 马尔科夫随机场和马尔科夫链

热门文章

  1. 工作简历模板怎么写?
  2. adobe CC 2015/2017/2018安装失败
  3. 单片机项目经验到底是什么?项目开发培训真的靠谱吗?
  4. plc 滑台流程图_PLC控制直线滑台运动概述
  5. NFC手机读特定磁卡
  6. Spark 定制版:002~Spark Streaming(二)
  7. Spark Standalone单机模式环境搭建
  8. 国内最大盗号软件被查:缴获703万张手机黑卡
  9. i5 10400和i710700 的区别
  10. Java | 使用 Hibernate Search 构建一个带有全文搜索的 Spring Boot REST API (二)