在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 ...
随机推荐
- Jmeter json断言的使用
1 添加方式:取样器右键->添加->断言->JSON断言 作用:使用JSON表达式提取实际数据与预期进行比较 2首先我们来了解下断言组件的各个功能: Asset JSON Pat ...
- MarkDown --- 数学公式语法集
介绍 Markdown 是一种轻量级标记语言,它允许你使用易于阅读.易于编写的纯文本格式来创建富文本内容.通过简单的标记符号,如井号(#).星号(*)和下划线(_),可以快速地添加标题.粗体.斜体.链 ...
- 将Abp移植进.NET MAUI项目(三):构建UI层
很开心,终于到了创建页面的时候了! 我们需要两个页面 MainPage 主页面 MusicItemPage 条目编辑页面 编写主页面 新建一个MainPageViewModel.cs,作为Main ...
- 油猴脚本 - dicts.cn 单词自动跳转 双核浏览器可用
跳转格式 http://www.dicts.cn/?w=blight 20230605 更新 // ==UserScript== // @name dicts.cn 单词自动跳转 双核浏览器可用 // ...
- 摆脱鼠标系列 - vscode - Esc 返回时候 强制显示英文输入法 - ahk 脚本 - autoHotKey
为什么 摆脱鼠标系列 - vscode - Esc 返回时候 强制显示英文输入法 切换网页的时候,回来还是搜索输入法,就想到按esc,直接强制英文输入法 之前vim插件里面 用了一个 im-selec ...
- C++ 派生类对象的构造与析构过程
C++ 派生类对象的构造与析构过程 因为基类的成员变量和派生类的成员变量在内存中的连续的(下面程序会验证这一点),如下图所示: 所以构造派生类对象的时候,构造成员变量的过程就像入栈一样: 那么很自然, ...
- 大模型应用开发:手把手教你部署并使用清华智谱GLM大模型
部署一个自己的大模型,没事的时候玩两下,这可能是很多技术同学想做但又迟迟没下手的事情,没下手的原因很可能是成本太高,近万元的RTX3090显卡,想想都肉疼,又或者官方的部署说明过于简单,安装的时候总是 ...
- 记录--Object.assign 这算是深拷贝吗
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 在JavaScript中,Object.assign() 是一个用于合并对象属性的常见方法.然而,对于许多开发者来说,关于它是否执行深拷贝 ...
- 记录--try...catch知识补全
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 说到try...catch都觉得非常熟悉了,不就是用来捕捉代码块中的错误嘛,平时也用得比较多的.然而因为了解不够多,我的面试却栽在了一个简 ...
- 记录-一个栗子让你彻底弄懂CSS3补间动画和逐帧动画
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 CSS3提供了Animation关键帧动画,我们在工作中比较常用.但在写CSS动画的时候,其实Animation能实现两种动画模式: 补间 ...