二叉树设计

定义节点类

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. Jmeter json断言的使用

    1 添加方式:取样器右键->添加->断言->JSON断言 作用:使用JSON表达式提取实际数据与预期进行比较   2首先我们来了解下断言组件的各个功能: Asset JSON Pat ...

  2. MarkDown --- 数学公式语法集

    介绍 Markdown 是一种轻量级标记语言,它允许你使用易于阅读.易于编写的纯文本格式来创建富文本内容.通过简单的标记符号,如井号(#).星号(*)和下划线(_),可以快速地添加标题.粗体.斜体.链 ...

  3. 将Abp移植进.NET MAUI项目(三):构建UI层

    ​ 很开心,终于到了创建页面的时候了! 我们需要两个页面 MainPage 主页面 MusicItemPage 条目编辑页面 编写主页面 新建一个MainPageViewModel.cs,作为Main ...

  4. 油猴脚本 - dicts.cn 单词自动跳转 双核浏览器可用

    跳转格式 http://www.dicts.cn/?w=blight 20230605 更新 // ==UserScript== // @name dicts.cn 单词自动跳转 双核浏览器可用 // ...

  5. 摆脱鼠标系列 - vscode - Esc 返回时候 强制显示英文输入法 - ahk 脚本 - autoHotKey

    为什么 摆脱鼠标系列 - vscode - Esc 返回时候 强制显示英文输入法 切换网页的时候,回来还是搜索输入法,就想到按esc,直接强制英文输入法 之前vim插件里面 用了一个 im-selec ...

  6. C++ 派生类对象的构造与析构过程

    C++ 派生类对象的构造与析构过程 因为基类的成员变量和派生类的成员变量在内存中的连续的(下面程序会验证这一点),如下图所示: 所以构造派生类对象的时候,构造成员变量的过程就像入栈一样: 那么很自然, ...

  7. 大模型应用开发:手把手教你部署并使用清华智谱GLM大模型

    部署一个自己的大模型,没事的时候玩两下,这可能是很多技术同学想做但又迟迟没下手的事情,没下手的原因很可能是成本太高,近万元的RTX3090显卡,想想都肉疼,又或者官方的部署说明过于简单,安装的时候总是 ...

  8. 记录--Object.assign 这算是深拷贝吗

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 在JavaScript中,Object.assign() 是一个用于合并对象属性的常见方法.然而,对于许多开发者来说,关于它是否执行深拷贝 ...

  9. 记录--try...catch知识补全

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 说到try...catch都觉得非常熟悉了,不就是用来捕捉代码块中的错误嘛,平时也用得比较多的.然而因为了解不够多,我的面试却栽在了一个简 ...

  10. 记录-一个栗子让你彻底弄懂CSS3补间动画和逐帧动画

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 CSS3提供了Animation关键帧动画,我们在工作中比较常用.但在写CSS动画的时候,其实Animation能实现两种动画模式: 补间 ...