【python中二叉树的实现】python中二叉树的创建、三种方式递归遍历和非递归遍历
代码如下:
# coding=utf-8 class myNode(object):
def __init__(self, data=-1, lchild=None, rchild=None):
self.data = data
self.lchild = lchild
self.rchild = rchild class BTTree(object):
def __init__(self):
self.root = None # 建立二叉树是以层序遍历方式输入,节点不存在时以 'None' 表示
def creatTree(self, nodeList):
if nodeList[0] == None:
return None
head = myNode(nodeList[0])
Nodes = [head]
j = 1
for node in Nodes:
if node != None:
node.lchild = (myNode(nodeList[j]) if nodeList[j] != None else None)
Nodes.append(node.lchild)
j += 1
if j == len(nodeList):
return head
node.rchild = (myNode(nodeList[j])if nodeList[j] != None else None)
j += 1
Nodes.append(node.rchild)
if j == len(nodeList):
return head def digui_qianxu(self, root):
if root is None:
return
print root.data
self.digui_qianxu(root.lchild)
self.digui_qianxu(root.rchild) def digui_zhongxu(self, root):
if root is None:
return
self.digui_zhongxu(root.lchild)
print root.data
self.digui_zhongxu(root.rchild) def digui_houxu(self, root):
if root is None:
return
self.digui_houxu(root.lchild)
self.digui_houxu(root.rchild)
print root.data def feidigui_qianxu(self, root):
#通过堆栈来存储根节点,遍历根节点从root开始一直往下走到最左边的根节点将之加入到栈中,在加入栈中之前就进行访问
#将栈中的内容不断从最后弹出,然后查找其是否有右孩子,没有则继续弹出栈中的元素,有的话则访问
myStack = []
node = root
while node or myStack:
while node!= None:
print node.data
myStack.append(node)
node = node.lchild
elem = myStack.pop()
if elem.rchild != None:
node = elem.rchild def feidigui_zhongxu(self, root):
myStack = []
node = root
while node or myStack:
while node != None:
myStack.append(node)
node = node.lchild
elem = myStack.pop()
print elem.data
if elem.rchild != None:
node = elem.rchild def feidigui_houxu(self, root):
#因为是左右然后根,需要保留根才能得到左和右,首先从根pop之后找到左加入到栈,找到右加入到栈
#之后将根加入到另一个栈中,这样另一个栈中得到的就是:根右左的顺序
#等将另一个栈进行持续pop,得到的就是:左右根这样的顺序
myStack1 = []
myStack2 = []
myStack1.append(root)
while myStack1:
node = myStack1.pop()
if node.lchild != None:
myStack1.append(node.lchild)
if node.rchild != None:
myStack1.append(node.rchild)
myStack2.append(node)
while myStack2:
print myStack2.pop().data if __name__ == "__main__":
test1 = BTTree()
nodeList = [1,2,3,4,5,6]
print '建树:'
test1.root = test1.creatTree(nodeList)
print '递归前序:'
test1.digui_qianxu(test1.root)
print '----------------------'
print '递归中序:'
test1.digui_zhongxu(test1.root)
print '----------------------'
print '递归后序:'
test1.digui_houxu(test1.root)
print '----------------------'
print '非递归前序:'
test1.feidigui_qianxu(test1.root)
print '----------------------'
print '非递归中序:'
test1.feidigui_zhongxu(test1.root)
print '----------------------'
print '非递归后序:'
test1.feidigui_houxu(test1.root)
print '----------------------'
结果如下:
建树:
递归前序:
1
2
4
5
3
6
----------------------
递归中序:
4
2
5
1
6
3
----------------------
递归后序:
4
5
2
6
3
1
----------------------
非递归前序:
1
2
4
5
3
6
----------------------
非递归中序:
4
2
5
1
6
3
----------------------
非递归后序:
4
5
2
6
3
1
----------------------
【python中二叉树的实现】python中二叉树的创建、三种方式递归遍历和非递归遍历的更多相关文章
- 【转载】Python中如何高效实现两个字典合并,三种方法比较。
本文转载自:http://www.pythoner.com/13.html Python中将两个字典进行合并操作,是一个比较常见的问题.本文将介绍几种实现两个字典合并的方案,并对其进行比较. 对于这个 ...
- Python中字符串拼接的三种方式
在Python中,我们经常会遇到字符串的拼接问题,在这里我总结了三种字符串的拼接方式: 1.使用加号(+)号进行拼接 加号(+)号拼接是我第一次学习Python常用的方法,我们只需要把我们要加 ...
- 记住 Python 变量类型的三种方式
title: 记住变量类型的三种方式 date: 2017-06-11 15:25:03 tags: ['Python'] category: ['Python'] toc: true comment ...
- python实现单例模式的三种方式及相关知识解释
python实现单例模式的三种方式及相关知识解释 模块模式 装饰器模式 父类重写new继承 单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singlet ...
- python 全栈开发,Day94(Promise,箭头函数,Django REST framework,生成json数据三种方式,serializers,Postman使用,外部python脚本调用django)
昨日内容回顾 1. 内容回顾 1. VueX VueX分三部分 1. state 2. mutations 3. actions 存放数据 修改数据的唯一方式 异步操作 修改state中数据的步骤: ...
- 命令行运行Python脚本时传入参数的三种方式
原文链接:命令行运行Python脚本时传入参数的三种方式(原文的几处错误在此已纠正) 如果在运行python脚本时需要传入一些参数,例如gpus与batch_size,可以使用如下三种方式. pyth ...
- Python实现定时执行任务的三种方式简单示例
本文实例讲述了Python实现定时执行任务的三种方式.分享给大家供大家参考,具体如下: 1.定时任务代码 import time,os,sched schedule = sched.scheduler ...
- Python格式化输出的三种方式
Python格式化输出的三种方式 一.占位符 程序中经常会有这样场景:要求用户输入信息,然后打印成固定的格式比如要求用户输入用户名和年龄,然后打印如下格式:My name is xxx,my age ...
- Python|读、写Excel文件(三种模块三种方式)
python读写excel的方式有很多,不同的模块在读写的讲法上稍有区别: 用xlrd和xlwt进行excel读写: 用openpyxl进行excel读写: 用pandas进行excel读写: imp ...
- Python实现微信支付(三种方式)
Python实现微信支付(三种方式) 关注公众号"轻松学编程"了解更多. 如果需要python SDk源码,可以加我微信[1257309054] 在文末有二维码. 一.准备环境 1 ...
随机推荐
- cannot find package "context"
导入 github.com/go-sql-driver/mysql 和 database/sql 时,报cannot find package "context"的错误因为go1 ...
- (翻译).NET应用架构
.NET应用架构 Kalyan Bandarupalli著,hystar翻译 这个系列文章将帮助.NET开发人员与架构师使用最新的.NET技术设计高效的.NET应用.关于应用架构这方面虽然已有很多文章 ...
- Session、Cookie、Cache、Token分别是什么及区别
一.Session 1 )Session 解释 Session 是单用户的会话状态.当用户访问网站时,产生一个 sessionid.并存在于 cookies中.每次向服务器请求时,发送这个 cooki ...
- Linux(Centos7)下搭建SVN服务器
操作系统: CentOS 7.6 64位 第一步:通过yum命令安装svnserve,命令如下: 检测svn是否安装: rpm -qa subversion #检查现有版本,如果输入命令后没有提示的话 ...
- Mysql常见的优化策略
数据库设计方面优化 1.数据库设计符合第三范式,为了查询方便可以有一定的数据冗余.2.选择数据类型优先级 int > date,time > enum,char>varchar &g ...
- 第三章 C#程序结构(3.1 顺序与选择结构)
[案例]输入某一学生的成绩,输出其对应的档次.具体规定:90分以上为优秀,80分以上至89分为良好,70分至79分为一般,60分至69分为合格,59以下为不及格.如果输入的分数小于0或大于100,则输 ...
- Windows不要使用记事本编辑文本文件
摘自:廖雪峰 千万不要使用Windows自带的记事本编辑任何文本文件.原因是Microsoft开发记事本的团队使用了一个非常弱智的行为来保存UTF-8编码的文件,他们自作聪明地在每个文件开头添加了0x ...
- 3.STM32复位系统
一.概念 复位: 使系统结束当前运行状态,重新开始运行,并根据复位种类,将系统的寄存器(特定的寄存器除外)恢复到默认状态. 二.复位的种类 1.系统复位 将除了系统后备区域寄存器(BKP)和时钟控制寄 ...
- ros有一个比较安全的登录方案:二次登录防火墙
原文: https://www.winbox.org/ /ip firewall address-list add address=10.0.0.0/8 list=login /ip firewall ...
- 内训--PPT演示技巧
企业内训,实操,不涉及如何做PPT,仅讲解PPT播放等内容.做好PPT后,在演讲的过程中,如何使用这些功能.