在python中实现二叉树
二叉树设计
定义节点类
class Node:
# 修改初始化方法
def init(self,value):
self.value = value # 节点值
self.left = None # 左子树
self.right = None # 右子树
定二叉树类
class BinaryTree:
# 修改初始化方法
def init(self,root=None):
self.root = root # 根节点
# 定义添加节点方法 广度优先
def add(self,value):
if self.root == None:
self.root = Node(value)
return # 根节点已存在,不再添加
# 根节点不为空,开始遍历
queue= []
# 将根节点加入队列
queue.append(self.root)
# 循环判断,哪个节点为空,将新节点加入该节点
while True:
# 从队列中取出根节点
node = queue.pop(0)
# 判断该节点左子树是否为空
if node.left == None:
node.left = Node(value)
return
else:
queue.append(node.left)
# 判断该节点右子树是否为空
if node.right == None:
node.right = Node(value)
return
else:
queue.append(node.right)
# 遍历二叉树 广度优先
def traverse(self,root):
# 判断根节点是否为空,若为空,则返回
if self.root == None:
return
# 创建队列
queue = []
# 将根节点添加到队列中
queue.append(self.root)
# 循环遍历,根据队列长度来循环,需要大于0
while len(queue) > 0:
# 从队列中取出节点
node = queue.pop(0)
# 打印节点内容
print(node.value,end=' ')
# 判断左子树是否为空,若不为空,则添加到队列中
if node.left != None:
queue.append(node.left)
# 判断右子树是否为空,若不为空,则添加队列中
if node.right != None:
queue.append(node.right)
# 遍历二叉树,深度优先,先序遍历 (根左右)
def pre_traverse(self,root):
# 判断根节点是否为空,不为空则执行
if root is not None:
# 打印根节点
print(root.value,end=' ')
# 递归调用左子树
self.pre_traverse(root.left)
# 递归调用右子树
self.pre_traverse(root.right)
# 遍历二叉树,深度优先,中序遍历 (左根右)
def mid_traverse(self,root):
# 判断根节点是否为空,不为空则执行
if root is not None:
# 递归调用左子树
self.mid_traverse(root.left)
# 打印根节点
print(root.value,end=' ')
# 递归调用右子树
self.mid_traverse(root.right)
# 遍历二叉树,深度优先,后序遍历 (左右根)
def post_traverse(self,root):
# 判断根节点是否为空,不为空则执行
if root is not None:
# 递归调用左子树
self.post_traverse(root.left)
# 递归调用右子树
self.post_traverse(root.right)
# 打印根节点
print(root.value,end=' ')
测试
def Dm01():
# 创建二叉树
tree = BinaryTree()
# 添加节点
tree.add(0)
tree.add(1)
tree.add(2)
tree.add(3)
tree.add(4)
tree.add(5)
tree.add(6)
tree.add(7)
tree.add(8)
tree.add(9)
# 先序遍历
print("\n先序遍历:")
tree.pre_traverse(tree.root)
# 中序遍历
print("\n中序遍历:")
tree.mid_traverse(tree.root)
# 后序遍历
print("\n后序遍历:")
tree.post_traverse(tree.root)
运行测试
if name == 'main':
Dm01()1.
在python中实现二叉树的更多相关文章
- python实战--数据结构二叉树
此文将讲述如何用python实战解决二叉树实验 前面已经讲述了python语言的基本用法,现在让我们实战一下具体明确python的用法 点击我进入python速成笔记 先看一下最终效果图: 首先我们要 ...
- Python中的高级数据结构详解
这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考 ...
- Python中的高级数据结构(转)
add by zhj: Python中的高级数据结构 数据结构 数据结构的概念很好理解,就是用来将数据组织在一起的结构.换句话说,数据结构是用来存储一系列关联数据的东西.在Python中有四种内建的数 ...
- XGBoost中参数调整的完整指南(包含Python中的代码)
(搬运)XGBoost中参数调整的完整指南(包含Python中的代码) AARSHAY JAIN, 2016年3月1日 介绍 如果事情不适合预测建模,请使用XGboost.XGBoost算法已 ...
- python数据结构之二叉树的统计与转换实例
python数据结构之二叉树的统计与转换实例 这篇文章主要介绍了python数据结构之二叉树的统计与转换实例,例如统计二叉树的叶子.分支节点,以及二叉树的左右两树互换等,需要的朋友可以参考下 一.获取 ...
- [转]Python中的str与unicode处理方法
早上被python的编码搞得抓耳挠腮,在搜资料的时候感觉这篇博文很不错,所以收藏在此. python2.x中处理中文,是一件头疼的事情.网上写这方面的文章,测次不齐,而且都会有点错误,所以在这里打算自 ...
- python中的Ellipsis
...在python中居然是个常量 print(...) # Ellipsis 看别人怎么装逼 https://www.keakon.net/2014/12/05/Python%E8%A3%85%E9 ...
- python中的默认参数
https://eastlakeside.gitbooks.io/interpy-zh/content/Mutation/ 看下面的代码 def add_to(num, target=[]): tar ...
- Python中的类、对象、继承
类 Python中,类的命名使用帕斯卡命名方式,即首字母大写. Python中定义类的方式如下: class 类名([父类名[,父类名[,...]]]): pass 省略父类名表示该类直接继承自obj ...
- python中的TypeError错误解决办法
新手在学习python时候,会遇到很多的坑,下面来具体说说其中一个. 在使用python编写面向对象的程序时,新手可能遇到TypeError: this constructor takes no ar ...
随机推荐
- C#多线程(9):多阶段并行线程
目录 前言 Barrier 类 属性和方法 示例 新的示例 说明 前言 这一篇,我们将学习用于实现并行任务.使得多个线程有序同步完成多个阶段的任务. 应用场景主要是控制 N 个线程(可随时增加或减少执 ...
- Nebula Graph 在大规模数据量级下的实践和定制化开发
本文作者系微信技术专家李本利 图数据在社交推荐.多跳实时计算.风控和安全等领域有可期待的前景.如何用图数据库高效存储和查询大规模异构图数据,是一个重大挑战.本文描述了开源分布式图数据库 Nebula ...
- 360 数科实践:JanusGraph 到 NebulaGraph 迁移
摘要:在本文中 360 数科的周鹏详细讲解了业务从 JanusGraph 迁移到 Nebula Graph 带来的性能提升,在机器资源不到之前 JanusGraph 配置三分之一的情况下,业务性能提升 ...
- ffmpeg 使用记录
这周周末尝试把我硬盘上面的视频文件压缩了一下,但是效果并不理想.其中主要有两个原因, 视频本来就是h264的编码,再重新编码也没啥用,因为限制大小的主要是码率 ffmpeg GPU加速版的h265编码 ...
- 基于ads1299生物电信号采集研发总结之参考信号的接法
一 概念 ads1299的电极端有两种采集方式,单端和差分.两种的使用方式又有很大的区别,怎么高质量的采集信号,这个是一个比较难的问题. 二 解析 参考信号SRB1的接法,决定了采集到数据的精确度和信 ...
- 加密与安全:非对称加密算法 RSA 1024 公钥、秘钥、明文和密文长度
RSA 1024 是指公钥及私钥分别是 1024bit,也就是 1024/8 = 128Bytes. RSA 原理 RSA 算法密钥长度的选择是安全性和程序性能平衡的结果,密钥长度越长,安全性越好,加 ...
- (模板)Manacher算法:线性时间求字符串内回文子串的数量
已通过leetcode647:https://leetcode-cn.com/problems/palindromic-substrings/ void get_d(vector<int> ...
- 实时云渲染 VS 本地渲染,全面横向对比
不少用户不能理解,为什么要选用实时云渲染,而不用本地的电脑进行渲染显示?本文将通过各个方面来对比两种模式的优劣支持,帮助您更全面了解实时云渲染和本地渲染. 一.便携性对比 由于GPU对机箱空间有要求, ...
- TagProvider 与 Enricher 丰富日志
TagProvider [LogProperties] 与 [LogPropertyIgnore] 如果用在DTO不存在任何问题,如果用在Domain实体上,可能有点混乱. 您可能不希望因日志记录问 ...
- 01.Android线程池实践基础
目录介绍 01.实际开发问题 02.线程池的优势 03.ThreadPoolExecutor参数 04.ThreadPoolExecutor使用 05.线程池执行流程 06.四种线程池类 07.exe ...