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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET性能系列文章二:Newtonsoft.Json vs System.Text.Json

微软终于追上了?图片来自 Glenn Carstens-Peters[1]Unsplash[2]欢迎来到.NET 性能系列的另一章。这个系列的特点是对.NET 世界中许多不同的主题进行研究、基准和比较。正如标题所说的那样,重点在于使用最新的.NET7 的性能。你将看到哪种方法是实现特定主…

android gpu平板 推荐,性能强的不像话,最强安卓平板华为平板M6上手

原标题:性能强的不像话,最强安卓平板华为平板M6上手你为什么买平板电脑?当这一问题问出以后,许多朋友的表情都很微妙,随后大概率的回答则相当统一:"我买平板干嘛?"。其实得到这样一个…

【Python】HackBack(获取暴力破解服务器密码的IP来源)

1、前言 又在0x00sec上翻到好东东。 https://0x00sec.org/t/python-hackback-updated/882 帖子里的脚本会得到那些暴力服务器密码失败的IP和用户名,并且使用shodan api做一个溯源定位。 #!/usr/bin/python3.4 import re import urllib.request import json log_path…

企业应用“数据优先”革命的下一个主战场:安全与运营

根据IDC发布的2015年全球CIO日程预测,80%的CIO将提供一个实现创新和改善业务决策的新体系架构。 大数据时代,企业软件市场正在经历一次大迁移,数以十亿计的企业IT支出预算将投向“数据优先”应用,而不是长久以来以业务流程和工作流…

给Web开发人员的以太坊入坑指南

以太坊现在各种学习资料数不胜数,但由于以太坊正处于飞速发展阶段,有些学习资料很快就过时了。所以想找到有价值的资料无异于大海捞针。我费了很大功夫,才建立起对以太坊的整体认识,搞清楚它的工作机制。我相信很多跃跃欲试的开发…

和硕看重物联网大势 程建中:从擅长领域出发

物联网(IoT)前景可期已是全球科技产业的共识,但是如何真正找出到位的商机,却考验产业链业者的智能。苹果iPhone代工厂和硕联合科技执行长程建中表示,物联网与大数据相关应用商机看俏,物联网筑的梦比网际网路还大,当年网…

html选择文本框后提示消失,两种方法实现文本框输入内容提示消失

第一种方法:基于HTML5 input标签的新特性 - placeholder 。另外,x-webkit-speech 属性可以实现语音输入功能。第二种方法:用span模拟,定位span,借助JS键盘事件判断输入,确定span里的内容显示隐藏。无标题文…

TensorFlow基本计算单元——变量

# -*- coding: utf-8 -*- import tensorflow as tf a 3 # 创建变量 w tf.Variable([[0.5, 1.0]]) #行向量 x tf.Variable([[2.0], [1.0]]) y tf.matmul(w, x) #矩阵相乘 print(y) # Tensor("MatMul:0", shape(1, 1), dtypefloat32)init_op tf.global_variables…

程序人生:织梦dedecms后台/会员验证码关闭

dedecms默认是所有的功能几乎只要用到验证码的地方我们都需要验证的,如果要关闭一些验证功能我们可以参考下面的教程,这里介绍了关闭后台,留言板,会员系统等验证码功能关闭了。提示:支持DedeCMS V5.6 以上的所有版本取…

html中图片的属性优化,Html标签元素在SEO中的优化方式(二)

接上html标签元素在SEO中的优化方式(一)中对HTML界面的介绍,我们今天继续补充HTML标签的SEO优化方式在内容中有几个值得去研究一下的优化元素--导航和内部链接:很明显的一点,建立导航会使搜索引擎可以容易的确定网站结构,但是很多…

Gartner认为安全性将取代成本和敏捷性成为政府部门采用云服务的首要原因

全球领先的信息技术研究和顾问公司Gartner表示,公有云如今具备可扩展性、计算威力、海量存储和安全性,可打造更好的政府数字化平台并满足对业绩和价值不断增长的期望值。 Gartner预计到2018年,提升的安全性将取代成本节约和敏捷性成为政府部门…

一款简单的缩放拖拽图片控件

本文介绍一个针对 .NET 桌面应用程序的独立图片缩放拖拽显示控件 SQPhoto[1]。SQPhoto 是一个 Windows 桌面应用的组件,支持 .NET6 和 .NET Framework 4.6 。基于 PictureBox 的图片展示工具,增加了拖动和缩放功能,便于在某些场景下的图片展…

安卓虚拟机与Hyper-V冲突

经过各种经验,哪个安卓虚拟机跟Hyper-V都存在着冲突。 解决方案一 程序中卸载Hyper-V,之后还要再配置太麻烦。 解决方案二 1、关掉Hyper-V的启动项,命令如下。 bcdedit /set hypervisorlaunchtype off 重启在开安卓模拟器蓝屏就没有了。 2、重…

共轨之家获吉利家族基金新一轮融资 5个月前曾获磐霖资本领投A轮融资

11月27日消息,近日,国内最大商用车技术服务平台共轨之家对外宣布完成新一轮融资。本轮融资由吉利家族基金投资,未来将推进共轨之家占领商用车后市场。 成立于2014年的共轨之家,以商用车技术知识科普社区起家,积累起国…

光伏产业的发展推动太阳能组件技术进步

从全球能源发展趋势的角度来看,太阳能等可再生能源势必逐步替代不可再生的传统能源,光伏产业将在全球各国的经济发展中扮演重要的角色。大力开发和利用光伏产业,对于优化我国能源结构,优化环境,保证我国社会经济可持续…

HTML怎么让div全透明,设置div为透明 怎样才让div里面的div不透明?

#a{ background:#FFCC33; filter:alpha(opacity:0); width: 300px; heig#a{background:#FFCC33; filter:alpha(opacity50); /*支持 IE 浏览器*/-moz-opacity:0.50; /*支持 FireFox 浏览器*/opacity:0.50; /*支持 Chrome, Opera, Safari 等浏览器*/width: 300px;height:300px;}还…

k64 datasheet学习笔记12---System Integration Module (SIM)

1.前言 Features of the SIM include: System clocking configuration(1)System clock divide values(2) Architectural clock gating control(3) USB clock selection and divide values(4&…

informix linux安装步骤

informix linux安装步骤整个安装过程都以root用户运行1. 创建informix用户# groupadd informix# useradd -g informix informix2. 创建安装目录: "/opt/informix"# mkdir /opt/informix# chown informix.informix /opt/informixyum install libc.so.6 libncurses.so.…

html overflow 样式,css样式之overflow-x属性样式

overflow-x是overflow子花样,平日也很少用的。overflow-x设置匿伏溢出过宽模式(比如过宽图片)、设置对象底部转折条等重要。overflow-x语法与根本懂得1、overflow-x可设置值overflow-x : visible | auto | hidden| scroll值与解释引见:visible :  不剪切…

泰国能源部携手本土企业打造智慧城市

泰国能源部与泰国安美德集团签署谅解备忘录,共同投资开发新能源在工业生产领域的应用。俞懿春 摄 泰国能源部与泰国安美德(AMATA)集团昨天在曼谷签署谅解备忘录,以公私合作模式推动安美德智慧城市开发,响应泰国政府提出…