【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 ...
随机推荐
- PythonStudy——流程控制 Process control
1. 分支结构 -- if -- if...else...-- if...elif...else...-- if嵌套 ''' if 条件: 同缩进的代码块 ''' if age > 18: pr ...
- WPF项目中解决ConfigurationManager不能用(转)
https://blog.csdn.net/MOESECSDN/article/details/78107888 在WPF项目中遇到这样的问题,做一下笔记.希望对自己和读者都有帮助. 在aap.con ...
- 高性能网络编程之IO和NIO阻塞分析
一.内容 1.阻塞和非阻塞是什么? 2.传统IO模型,他存在哪些阻塞点 3.NIO模型 4.对比总结 1.阻塞和非阻塞是什么? 阻塞:做某件事情,直到完成,除非超时,如果没有完成,继续等待. 非阻塞: ...
- ionic3安卓版release发布
1.进入到项目根目录 keytool -genkey -v -keystore your-full-keystore-name.keystore -alias your-lias-name -keya ...
- Linux的SIGUSR1和SIGUSR2信号
SIGUSR1 用户自定义信号 默认处理:进程终止SIGUSR2 用户自定义信号 默认处理:进程终止 当一个进程调用fork时,因为子进程在开始时复制父进程的存储映像,信号捕捉函数的地址在子进程中是 ...
- 减肥标准BMI指数
原文: https://baike.baidu.com/item/BMI%E6%8C%87%E6%95%B0/4477882?fromtitle=%E4%BD%93%E9%87%8D%E6%8C%87 ...
- 一个简单SpringBoot例子
一:为什么使用springBoot: 有利于开发(整合框架,例如整合了springMVC,Mybatis等框架); 启动无需配置tomcat(java应用程序运行,实际以jar包运行),内置tomca ...
- 手把手教你如何用 OpenCV + Python 实现人脸识别
下午的时候,配好了OpenCV的Python环境,OpenCV的Python环境搭建.于是迫不及待的想体验一下opencv的人脸识别,如下文. 必备知识 Haar-like 通俗的来讲,就是作为人脸特 ...
- 1816647 - Error "Data file of SAP Note is incomplete" uploading a note in SNOTE
ymptom When uploading an SAP Note in transaction SNOTE you receive the error "Data file of SAP ...
- 分布式计算课程补充笔记 part 1.5
▶ 编写 SLURM 脚本 #!/bin/bash #SBATCH -J name # 任务名 #SBATCH -p gpu # 分区名,可为 cpu 或 gpu #SBATCH -N # 节点数 # ...