转载自: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. (翻译) MongoDB(2) 数据库和集合
  2. hydra mysql 爆破_Hydra(爆破神器)使用方法
  3. SparkMLlib回归算法之决策树
  4. 编码基本功:给刚刚学习编程的朋友的建议
  5. iPhone手机下载应用软件的区别(itunes,i4和itools)
  6. 服务器显示A40故障码,求助大神,车子出现故障码,5053无法消除
  7. 操作系统原理课程 期末考试复习重点
  8. HttpUtil工具示例(GET、POST请求)IP工具根据token获取用户信息工具
  9. LittleVGL v7.5.0在STM32F103x上的移植
  10. mysql(zip版)下载安装教程
  11. Springboot集成百度地图实现定位打卡功能
  12. 使用pycallgraph分析python代码函数调用流程以及框架
  13. 通过UA区分微信PC端浏览器还是手机端浏览器
  14. python输入数学表达式并求值_Python 条件表达式求值
  15. 北大考研复试上机——W's Cipher
  16. 计算机中丟失Slc.dll,调试符号不会加载slc.dll和sppc.dll
  17. 汽车早讯丨庞大集团董事长回应高管降薪;一嗨租车达成新私有化协议
  18. 【unity3D】 分享学习路上的一些坑(一)——商店导入的模型人物站上去看起来是飘着的;
  19. 如何把安卓系统刷成linux,废旧Android手机如何改造成Linux服务器?
  20. Android kotlin实战之协程suspend详解与使用

热门文章

  1. 如何设计数据可视化平台
  2. 如何在应用交付上发布应用_面对应用交付中的新建与购买问题
  3. python(6):条件语句和循环语句 + 三元表达式
  4. 快速配置 Samba 将 Linux 目录映射为 Windows 驱动器,用于跨平台编程
  5. 如何禁用烦人的“insert”键
  6. 世纪前线网络质量测试工具 是什么_【案例分享】利用手持式测试工具对建筑控制系统快速排障的方法...
  7. CAD中PDF怎么转DWG
  8. Redis之发布与订阅
  9. 什么是软件测评?怎样选择软件测评机构
  10. zynq 的uart(ps)