python实现二叉树和它的七种遍历
介绍:
树是数据结构中非常重要的一种,主要的用途是用来提高查找效率,对于要重复查找的情况效果更佳,如二叉排序树、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实现二叉树和它的七种遍历相关推荐
- 让 Python 代码更易维护的七种武器——代码风格(pylint、Flake8、Isort、Autopep8、Yapf、Black)测试覆盖率(Coverage)CI(JK)...
让 Python 代码更易维护的七种武器 2018/09/29 · 基础知识 · 武器 原文出处: Jeff Triplett 译文出处:linux中国-Hank Chow 检查你的代码的质 ...
- python实现列表去重_python实现七种列表去重方法
#encoding=utf-8import timetime_start=time.time()print u"列表去重的七种方法"print u"第一种测试方法&quo ...
- 常用数据结构之二叉树及树的四种遍历方式
1.树 我们选择一种数据结构,不仅要能存储数据,而且要能体现数据之间的关系.目前数据主要有是三种关系一对一.一对多.多对多:之前我们讨论了线性表(数组.链表.栈.队列),其中的元素具有一对一的关系,通 ...
- 二叉树总结—建树和4种遍历方式(递归非递归)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013497151/article/details/27967155 今天总结一下二叉树.要考离散了 ...
- # 遍历结构体_关于二叉树怎样建立和四种遍历方法你知道吗?
1. 首先我们要知道二叉树的性质是什么2. 怎样建立二叉搜索树?3. 先序遍历4. 中序遍历5. 后序遍历6. 总结上述三种遍历规律7. 层序遍历 1. 首先我们要知道二叉树的性质是什么 在二叉树上, ...
- 二叉树的建立和三种遍历
二叉树的三种遍历是以根的遍历顺序来讲的 先序遍历(根左右) 中序遍历(左根右) 后序遍历(左右根) 二叉树是从根节点的那一层开始,从左至右读每一层的结点读入的.@表示空结点,#表示输入结束 #incl ...
- Python字典(dict )的几种遍历方式
1.使用 for key in dict遍历字典 可以使用for key in dict遍历字典中所有的键 x = {'a': 'A', 'b': 'B'} for key in x:print(ke ...
- 七种遍历HashMap的方法
//7种遍历hashMap的方法 public class HashMapCurrent {public static void main(String[] args) {HashMap<Int ...
- 永恒python配合什么主武器_让Python代码更易维护的七种武器
检查你的代码的质量,通过这些外部库使其更易维护. 可读性很重要. 随着软件项目进入"维护模式",对可读性和编码标准的要求很容易落空(甚至从一开始就没有建立过那些标准).然而,在代码 ...
最新文章
- Python 第二章-列表和元组
- 使用Eclipse构建Maven的SpringMVC项目
- flutter图片点击跳转_Flutter系列之Platform Channel使用详解
- 一:Java语言概述
- iOS手势全屏滑动返回
- dorado7.x form提交数据报错
- 一座5g基站造价多少?
- python中除法运算定律_数学有哪几种简便运算方法?(除了加、乘法交换、结合律,减、除法的性质)...
- 健康低辐射,信号全覆盖,飞鱼星i-Home覆盖方案上市
- 分销APP联盟商家入驻商城系统开发
- Win32 SDK 访问数据库
- 学 Flutter 不理解 Widget/Element/Render 三棵树?啥也不是!
- Java 反编译工具的使用与对比分析
- 新京报:区块链投资绝不能只听“演员的”
- 【4.3 欧拉函数详解】
- 2020.07.24日自编译L大源码openwrt固件x86软路由精简版
- 关于库位“参与MRP运算”与“不参与运算”相互变动的注意事项
- VUE初学--表单输入与v-model
- 视频直播新玩法中绕不开的混音技术
- 能干还是作死——从蜉蝣般的百度云商城谈起
热门文章
- T.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.Reflectio
- mac系统快捷键大全详细介绍
- MYSQL中最基础的的聚合函数(重点!)
- 盘点三个JavaScript案例——实现限时秒杀、定时跳转、改变盒子大小
- html怎么做模糊条纹,如何使用纯CSS实现彩虹条纹文字的效果
- horizon服务主要模块_Horizon Workspace 快速部署指南三(配置Workspace数据模块)
- java 简单事件的使用,如何正确的使用Java事件通知(1)
- git推送指令配置_git 常用命令
- 积木赛尔号机器人_赛尔号:谱尼三次败北,经历过被吊打、封印,一次比一次惨...
- 页面滚动时触发图片逐帧播放_如何在滚动效果上创建逐帧运动图像