介绍:

树是数据结构中非常重要的一种,主要的用途是用来提高查找效率,对于要重复查找的情况效果更佳,如二叉排序树、FP-树。另外可以用来提高编码效率,如哈弗曼树。 

代码:

用python实现树的构造和几种遍历算法,虽然不难,不过还是把代码作了一下整理总结。实现功能:

  • 树的构造
  • 递归实现先序遍历、中序遍历、后序遍历
  • 堆栈实现先序遍历、中序遍历、后序遍历
  • 队列实现层次遍历
#coding=utf-8class Node(object): """节点类""" def __init__(self, elem=-1, lchild=None, rchild=None): self.elem = elem self.lchild = lchild self.rchild = rchild class Tree(object): """树类""" def __init__(self): self.root = Node() self.myQueue = [] def add(self, elem): """为树添加节点""" node = Node(elem) if self.root.elem == -1: # 如果树是空的,则对根节点赋值 self.root = node self.myQueue.append(self.root) else: treeNode = self.myQueue[0] # 此结点的子树还没有齐。 if treeNode.lchild == None: treeNode.lchild = node self.myQueue.append(treeNode.lchild) else: treeNode.rchild = node self.myQueue.append(treeNode.rchild) self.myQueue.pop(0) # 如果该结点存在右子树,将此结点丢弃。 def front_digui(self, root): """利用递归实现树的先序遍历""" if root == None: return print root.elem, self.front_digui(root.lchild) self.front_digui(root.rchild) def middle_digui(self, root): """利用递归实现树的中序遍历""" if root == None: return self.middle_digui(root.lchild) print root.elem, self.middle_digui(root.rchild) def later_digui(self, root): """利用递归实现树的后序遍历""" if root == None: return self.later_digui(root.lchild) self.later_digui(root.rchild) print root.elem, def front_stack(self, root): """利用堆栈实现树的先序遍历""" if root == None: return myStack = [] node = root while node or myStack: while node: #从根节点开始,一直找它的左子树 print node.elem, myStack.append(node) node = node.lchild node = myStack.pop() #while结束表示当前节点node为空,即前一个节点没有左子树了 node = node.rchild #开始查看它的右子树 def middle_stack(self, root): """利用堆栈实现树的中序遍历""" if root == None: return myStack = [] node = root while node or myStack: while node: #从根节点开始,一直找它的左子树 myStack.append(node) node = node.lchild node = myStack.pop() #while结束表示当前节点node为空,即前一个节点没有左子树了 print node.elem, node = node.rchild #开始查看它的右子树 def later_stack(self, root): """利用堆栈实现树的后序遍历""" if root == None: return myStack1 = [] myStack2 = [] node = root myStack1.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: return myQueue = [] node = root myQueue.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)

总结:

树的遍历主要有两种,一种是深度优先遍历,像前序、中序、后序;另一种是广度优先遍历,像层次遍历。在树结构中两者的区别还不是非常明显,但从树扩展到有向图,到无向图的时候,深度优先搜索和广度优先搜索的效率和作用还是有很大不同的。 
深度优先一般用递归,广度优先一般用队列。一般情况下能用递归实现的算法大部分也能用堆栈来实现。

我印象中是有递归构造树的方法,却一直想不出该怎么构造。后来仔细想了一下,递归思想有点类似深度优先算法,而树的构造应该是广度优先的。如果用递归的话一定要有个终止条件,例如规定树深等。不然构造出来的树会偏向左单子树或者右单子树。所以一般树的构造还是应该用队列比较好。

以上说的不够严谨,有错误之处,欢迎指正!

转载于:https://www.cnblogs.com/shiguangrenran/p/8143694.html

python实现二叉树和它的七种遍历相关推荐

  1. 让 Python 代码更易维护的七种武器——代码风格(pylint、Flake8、Isort、Autopep8、Yapf、Black)测试覆盖率(Coverage)CI(JK)...

    让 Python 代码更易维护的七种武器 2018/09/29 · 基础知识 · 武器 原文出处: Jeff Triplett   译文出处:linux中国-Hank Chow    检查你的代码的质 ...

  2. python实现列表去重_python实现七种列表去重方法

    #encoding=utf-8import timetime_start=time.time()print u"列表去重的七种方法"print u"第一种测试方法&quo ...

  3. 常用数据结构之二叉树及树的四种遍历方式

    1.树 我们选择一种数据结构,不仅要能存储数据,而且要能体现数据之间的关系.目前数据主要有是三种关系一对一.一对多.多对多:之前我们讨论了线性表(数组.链表.栈.队列),其中的元素具有一对一的关系,通 ...

  4. 二叉树总结—建树和4种遍历方式(递归非递归)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013497151/article/details/27967155 今天总结一下二叉树.要考离散了 ...

  5. # 遍历结构体_关于二叉树怎样建立和四种遍历方法你知道吗?

    1. 首先我们要知道二叉树的性质是什么2. 怎样建立二叉搜索树?3. 先序遍历4. 中序遍历5. 后序遍历6. 总结上述三种遍历规律7. 层序遍历 1. 首先我们要知道二叉树的性质是什么 在二叉树上, ...

  6. 二叉树的建立和三种遍历

    二叉树的三种遍历是以根的遍历顺序来讲的 先序遍历(根左右) 中序遍历(左根右) 后序遍历(左右根) 二叉树是从根节点的那一层开始,从左至右读每一层的结点读入的.@表示空结点,#表示输入结束 #incl ...

  7. Python字典(dict )的几种遍历方式

    1.使用 for key in dict遍历字典 可以使用for key in dict遍历字典中所有的键 x = {'a': 'A', 'b': 'B'} for key in x:print(ke ...

  8. 七种遍历HashMap的方法

    //7种遍历hashMap的方法 public class HashMapCurrent {public static void main(String[] args) {HashMap<Int ...

  9. 永恒python配合什么主武器_让Python代码更易维护的七种武器

    检查你的代码的质量,通过这些外部库使其更易维护. 可读性很重要. 随着软件项目进入"维护模式",对可读性和编码标准的要求很容易落空(甚至从一开始就没有建立过那些标准).然而,在代码 ...

最新文章

  1. Python 第二章-列表和元组
  2. 使用Eclipse构建Maven的SpringMVC项目
  3. flutter图片点击跳转_Flutter系列之Platform Channel使用详解
  4. 一:Java语言概述
  5. iOS手势全屏滑动返回
  6. dorado7.x form提交数据报错
  7. 一座5g基站造价多少?
  8. python中除法运算定律_数学有哪几种简便运算方法?(除了加、乘法交换、结合律,减、除法的性质)...
  9. 健康低辐射,信号全覆盖,飞鱼星i-Home覆盖方案上市
  10. 分销APP联盟商家入驻商城系统开发
  11. Win32 SDK 访问数据库
  12. 学 Flutter 不理解 Widget/Element/Render 三棵树?啥也不是!
  13. Java 反编译工具的使用与对比分析
  14. 新京报:区块链投资绝不能只听“演员的”
  15. 【4.3 欧拉函数详解】
  16. 2020.07.24日自编译L大源码openwrt固件x86软路由精简版
  17. 关于库位“参与MRP运算”与“不参与运算”相互变动的注意事项
  18. VUE初学--表单输入与v-model
  19. 视频直播新玩法中绕不开的混音技术
  20. 能干还是作死——从蜉蝣般的百度云商城谈起

热门文章

  1. T.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.Reflectio
  2. mac系统快捷键大全详细介绍
  3. MYSQL中最基础的的聚合函数(重点!)
  4. 盘点三个JavaScript案例——实现限时秒杀、定时跳转、改变盒子大小
  5. html怎么做模糊条纹,如何使用纯CSS实现彩虹条纹文字的效果
  6. horizon服务主要模块_Horizon Workspace 快速部署指南三(配置Workspace数据模块)
  7. java 简单事件的使用,如何正确的使用Java事件通知(1)
  8. git推送指令配置_git 常用命令
  9. 积木赛尔号机器人_赛尔号:谱尼三次败北,经历过被吊打、封印,一次比一次惨...
  10. 页面滚动时触发图片逐帧播放_如何在滚动效果上创建逐帧运动图像