二叉树设计

定义节点类

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中实现二叉树的更多相关文章

  1. python实战--数据结构二叉树

    此文将讲述如何用python实战解决二叉树实验 前面已经讲述了python语言的基本用法,现在让我们实战一下具体明确python的用法 点击我进入python速成笔记 先看一下最终效果图: 首先我们要 ...

  2. Python中的高级数据结构详解

    这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考 ...

  3. Python中的高级数据结构(转)

    add by zhj: Python中的高级数据结构 数据结构 数据结构的概念很好理解,就是用来将数据组织在一起的结构.换句话说,数据结构是用来存储一系列关联数据的东西.在Python中有四种内建的数 ...

  4. XGBoost中参数调整的完整指南(包含Python中的代码)

    (搬运)XGBoost中参数调整的完整指南(包含Python中的代码) AARSHAY JAIN, 2016年3月1日     介绍 如果事情不适合预测建模,请使用XGboost.XGBoost算法已 ...

  5. python数据结构之二叉树的统计与转换实例

    python数据结构之二叉树的统计与转换实例 这篇文章主要介绍了python数据结构之二叉树的统计与转换实例,例如统计二叉树的叶子.分支节点,以及二叉树的左右两树互换等,需要的朋友可以参考下 一.获取 ...

  6. [转]Python中的str与unicode处理方法

    早上被python的编码搞得抓耳挠腮,在搜资料的时候感觉这篇博文很不错,所以收藏在此. python2.x中处理中文,是一件头疼的事情.网上写这方面的文章,测次不齐,而且都会有点错误,所以在这里打算自 ...

  7. python中的Ellipsis

    ...在python中居然是个常量 print(...) # Ellipsis 看别人怎么装逼 https://www.keakon.net/2014/12/05/Python%E8%A3%85%E9 ...

  8. python中的默认参数

    https://eastlakeside.gitbooks.io/interpy-zh/content/Mutation/ 看下面的代码 def add_to(num, target=[]): tar ...

  9. Python中的类、对象、继承

    类 Python中,类的命名使用帕斯卡命名方式,即首字母大写. Python中定义类的方式如下: class 类名([父类名[,父类名[,...]]]): pass 省略父类名表示该类直接继承自obj ...

  10. python中的TypeError错误解决办法

    新手在学习python时候,会遇到很多的坑,下面来具体说说其中一个. 在使用python编写面向对象的程序时,新手可能遇到TypeError: this constructor takes no ar ...

随机推荐

  1. 一文了解 Nebula Graph DBaaS 服务——Nebula Graph Cloud Service

    Nebula Graph DBaaS 作为一款 DBaaS(DataBase as s Service)的产品,Nebula Graph Cloud Service 极大地降低了研发人员使用 Nebu ...

  2. 轻量级NuGet—BaGet

    1. 介绍 BaGet是一个轻量级的包管理服务.有些时候公司或者个人不希望某一些包进行公开,那么就需要使用私有的包管理服务程序,该服务是用.netcore进行编写的(感谢开发者为社区做出的共享) Gi ...

  3. Ubuntu 离线安装软件包

    Ubuntu 离线安装软件包 关键词:apt-offline,Ubuntu,dpkg,.deb 本文使用的ubuntu20.04,当机器无法连接外网时,我们使用离线的方式安装软件包. 离线安装的软件包 ...

  4. 2FA双因素认证 - 原理和应用

    主页 个人微信公众号:密码应用技术实战 个人博客园首页:https://www.cnblogs.com/informatics/ 引言 我们在登陆网站.或者通过VPN访问公司内网时,除了输入用户口令外 ...

  5. Prettier 和 ESLint 冲突解决方案 eslint-config-prettier eslint-plugin-prettier

    划重点 eslint-config-prettier 禁用 eslint 冲突配置 eslint-plugin-prettier Prettier先格式化 (默认是先eslint格式化,再Pretti ...

  6. stream使用汇总

    整理了下java使用stream处理list的几个便捷的方法 准备数据 List<KnowledgeInfoTable> knowledgeInfoTables = knowledgeIn ...

  7. Java-求根号n

    平方,开根号在java中是很简单的,Math.sqrt(double n)或者 Math.pow(double a, double b),求a的b次方.但是我们可以自己想想,这些方法到底是怎么实现的. ...

  8. NA嵌入Flutter页面

    目录介绍 01.Android承载flutter容器 02.过时的NA跳转flutter方案 03.升级版本NA跳转Flutter处理 04.如何处理NA跳转flutter传参 05.思考遇到的几个问 ...

  9. nginx完全卸载删除

    nginx卸载 其实很简单,只需要两步即可完成! 第一步:输入以下指令全局查找nginx相关的文件: sudo find / -name nginx* 第二步:删除查找出来的所有nginx相关文件 s ...

  10. 如何使用文件传输协议ftp,教你使用文件传输协议命令行

    FTP是文件传输协议的缩写.顾名思义,FTP用于在网络上的计算机之间传输文件.您可以使用文件传输协议在计算机帐户之间交换文件,在帐户和台式计算机之间传输文件或访问在线软件档案.但是请记住,许多文件传输 ...