python 实现二叉树

2023-11-10

本文不涉及二叉树概念的详细讲解,而着重利用 python 实现二叉树,其中穿插代码讲解。

其它数据结构:链表栈和队列


在链表中,一个节点只能有一个后继节点和前驱节点。而在 中,一个节点可以有多个后继节点,但只能有一个前驱节点。节点的 表示有几个后继节点, 树的度是最大的节点的度。二叉树是度为 2 的树。

在树中,没有前驱节点的节点称为根节点,没有后继节点的节点称为叶子节点。前驱节点也称为父节点,后继节点也称为子节点。具有相同父节点的节点称为兄弟节点

节点

每个节点有两个后继节点,分别为左子节点和右子节点。

class Node():
    def __init__(self, item):
        self.elem = item
        self.lchild = None
        self.rchild = None

构造树

每个树有个根节点。

class Tree():
    def __init__(self):
        self.root = None

层遍历

树具有一个层次结构,从根节点最高层到最低层,每层从左向右遍历。需要借助队列实现。

def level_travel(self):
    if self.root == None:
        return 

    queue = [self.root]
    while queue:
        cur = node = queue.pop(0)
        print(cur.elem, end=" ")
        if cur.lchild != None:
            queue.append(cur.lchild)
        if cur.rchild != None:
            queue.append(cur.rchild)

添加节点

树具有一个层次结构,我们在每层按照从左至右的方向添加节点。我们从第一层开始,依次判断根节点是否有左子节点和右子节点,如果没有,则添加;如果有,则转到第二层。以此类推。实现上与层遍历有点类似。

def add(self, item):
    node = Node(item)

    # 如果节点为空
    if self.root == None:
        self.root = node
        return

    queue = [self.root]
    while queue:
        cur = queue.pop(0)
        if cur.lchild == None:
            cur.lchild = node
            return 
        else:
            queue.append(cur.lchild)
        if cur.rchild == None:
            cur.rchild = node
            return 
        else:
            queue.append(cur.rchild)

先序遍历

先序遍历是先遍历根节点,再遍历左子树,最后遍历右子树。对于遍历子树而言,也是遍历子树的根节点,再遍历子树的左子树,最后遍历子树的右子树。可以用递归实现。

def preorder_travel(self, node):
    # 如果节点为空
    if node == None:
        return
    
    print(node.elem, end=" ")
    self.preorder_travel(node.lchild)
    self.preorder_travel(node.rchild)

中序遍历

中序遍历则先遍历左子树,再遍历根节点,最后遍历右子树。

def inorder_travel(self, node):
    # 如果节点为空
    if node == None:
        return
    self.inorder_travel(node.lchild)
    print(node.elem, end=" ")
    self.inorder_travel(node.rchild)

后序遍历

后续遍历先遍历左子树,再遍历右子树,最后遍历根节点。

def postorder_travel(self, node):
    # 如果节点为空
    if node == None:
        return
    
    self.postorder_travel(node.lchild)
    self.postorder_travel(node.rchild)
    print(node.elem, end=" ")

测试

if __name__ == "__main__":
    t = Tree()
    t.add(0)
    t.add(1)
    t.add(2)
    t.add(3)
    t.add(4)
    t.add(5)
    t.add(6)
    t.add(7)
    t.add(8)
    t.add(9)

    t.level_travel()
    print()
    t.preorder_travel(t.root)
    print()
    t.inorder_travel(t.root)
    print()
    t.postorder_travel(t.root)
    print()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 实现二叉树 的相关文章

  • Python:urlretrieve PDF下载

    我在 Python 中使用 urllib 的 urlretrieve 函数来尝试从网站上获取一些 pdf 它 至少对我来说 已停止工作并正在下载损坏的数据 15 KB 而不是 164 KB 我已经用几个 pdf 对此进行了测试 但都没有成功
  • python中unicode字符串到ascii字符串的近似转换

    不知道这是否微不足道 但我需要将 unicode 字符串转换为 ascii 字符串 并且我不希望周围有所有这些转义字符 我的意思是 是否有可能 近似 转换为一些非常相似的 ascii 字符 例如 Gavin O Connor 转换为 Gav
  • from __future__ importabsolute_import 实际上做了什么?

    I have answered https stackoverflow com a 22679558 2588818一个关于Python中绝对导入的问题 我认为我通过阅读理解了这个问题Python 2 5 变更日志 https docs p
  • 有没有办法离线将多个 Plotly HTML 文件合并/嵌入到一个页面/HTML 文件中?

    我正在尝试将多个图表合并成一个 HTML 报告来发送 问题是我真的不认为子图是最好的主意 因为图表相对不相关 不同的 X Y 轴 我所需要做的只是将图表附加到 1 个 HTML 文件中 有一个指南解释了如何使用绘图 URL 来完成此操作 但
  • 不要在异常堆栈中显示 Python raise-line

    当我在 Python 库中引发自己的异常时 异常堆栈将引发行本身显示为堆栈的最后一项 这显然不是一个错误 在概念上是正确的 但是当您在外部使用代码 例如作为模块 时 它会将重点放在对调试无用的东西上 有没有办法避免这种情况并强制 Pytho
  • AWS Lambda - 在区域之间自动复制 EC2 快照?

    我想创建一个 Lambda 函数 python 它将自动将已创建的快照复制到另一个区域 我已联系 AWS Support 他们只向我发送了用于 RDS 数据库的 GitHub 脚本 没有 EC2 快照复制脚本 任何帮助都会很棒 谢谢 是的
  • 为什么我在 Python 中收到“连接被拒绝”错误? (插座)

    我是套接字新手 请原谅我完全缺乏理解 我有一个服务器脚本 server py usr bin python import socket import the socket module s socket socket Create a so
  • 使用 boto 和 python 从带有参数的布局创建 mTurk HIT

    我正在尝试利用 boto 在 Mechanical Turk 中生成 HIT 目标是使用我的 mTurk 帐户上已生成的通用布局 并向其传递图像 URL 以迭代创建 HIT 问题是 即使正确命名参数 如果图像 url boto 也不成功 我
  • 没有名为 objc 的模块

    我正在尝试将 cocoa python 与 Xcode 一起使用 但它总是会出现错误 Traceback most recent call last File main py line 10 in
  • Python - Map/Reduce - 如何在使用 DISCO 计数单词示例中读取 JSON 特定字段

    我正在按照 DISCO 示例来计算文件中的单词数 将单词数作为 Map Reduce 作业 http discoproject org doc disco start tutorial html 我对此工作没有任何问题 但是我想尝试从包含
  • 了解 Tensorflow 中的 while 循环

    我正在使用用于 Tensorflow 的 Python API https www tensorflow org api docs python 我正在努力实施罗森布罗克函数 https www sfu ca ssurjano rosen
  • NumPy 中 exp(-x^2) 的快速傅立叶变换

    I have to calculate numerically the 2nd derivative of a Gaussian function I ve read every question on this topic here bu
  • Kivy:滚动缩放

    有没有办法在桌面 kivy 应用程序上放大图像 例如使用鼠标滚轮缩放 这里似乎讨论过 https github com kivy kivy issues 3563 https github com kivy kivy issues 3563
  • Mac OS 上的 pybluez 安装错误

    我尝试安装pybluez使用以下命令 pip install pybluez sudo easy install pybluez 但对于这两个命令我最终都会出错 环境 Mac OSX 10 9 1 Python 2 7 点日志 cc fno
  • 将数值和分类数据混合到具有密集层的 keras 序列模型中

    我在 Pandas 数据框中有一个训练集 我将此数据框传递到model fit with df values 以下是有关 df 的一些信息 df values shape 981 5 df values 0 array 163 0 6 83
  • python字符串包含双引号字符

    我的输入字符串由字符组成 包括双引号和单引号 和 B SS JU PQ AD DDSFD ABD E J 但是 当我从文本文件打开上述输入并打印它时 第三行中的双引号 被打印为 xe2 x80 x9d 我的目标是进行简单的字符计数 B 2
  • 如何加速Python循环

    我查看了几个网站上的一些讨论 但没有一个给我解决方案 这段代码运行时间超过5秒 for i in xrange 100000000 pass 我正在研究整数优化问题 我必须使用O n log n 算法编辑 O n 4 算法 其中n代表矩阵的
  • 交响二阶颂歌

    我有一个简单的二阶 ODE 的齐次解 当我尝试使用 Sympy 求解初始值时 它返回相同的解 它应该替代 y 0 和 y 0 并产生一个没有常数的解 但事实并非如此 这是建立方程的代码 它是一个弹簧平衡方程 k 弹簧常数 m 质量 我在其他
  • 安装 confluence-kafka 时“文件名或扩展名太长”?

    我在使用 pip install confluence kafka 安装 confluence kafka 时遇到一些问题 但我收到此错误 文件名或扩展名太长 详细信息如下 Collecting confluent kafka Using
  • 预提交钩子 git 错误

    我正在尝试在 python 中执行预提交 git hook 以检查文件的行长度是否小于 80 个字符 但是我收到没有此类文件 目录的错误 我在 fedora 上并设置了 usr bin python help 将不胜感激 usr bin e

随机推荐

  • Difference Between LiDAR and RADAR——LiDAR和RADAR的不同

    Difference Between LiDAR and RADAR 原文连接 https www differencebetween com difference between lidar and vs radar 翻译 RADAR和L
  • ifconfig命令不存在command not found

    ifconfig命令不存在command not found场景 刚刚装linux centos mini 想用远程工具链接 首先得查看一下ip吧 结果发现 ifconfig命令不存在 一个命令不存在 无非两种情况 情况一 不在环境变量中
  • 【云原生

    目录 四 通过 k8s 实现滚动更新 4 3 自定义滚动更新策略 取值范围 建议配置 总结 测试 自定义策略 重建式更新 Recreate 五 生产环境如何实现蓝绿部署 5 1 什么是蓝绿部署 5 2 蓝绿部署的优势和缺点 优点 缺点 5
  • 高精度光照传感器和普及型光照传感器的参数对比

    高精度光照传感器的技术参数 测量范围 0 200000lux 光谱范围 400 750nm 测量精度 2 分辨率 1lux 信号输出 电压型 供电电压 7V 24V DC 输出信号 0 4 2V 光照值 Lux Klux以上输出电压 0 4
  • 转置矩阵(Transpose of a matrix)

    定义 给定一个矩阵 A 将矩阵的行列互换得到的新矩阵称为转置矩阵 记为 转置矩阵的行列式不变 即 转置矩阵由下列动作建立 将 A 的横行写为 的纵列 将 A 的纵列写成 的横行 形式来说 m n 矩阵 A 的转置矩阵是 n m 矩阵 即 例
  • 2023华为OD机试真题【端口合并/贪心算法】

    题目描述 有 M 1 lt M lt 10 个端口组 每个端口组是长度为N 1 lt N lt 100 的整数数组 如果端口组间存在2个及以上不同端口相同 则认为这2个端口组 互相关联 可以合并 第一行输入端口组个数M 再输入M行 每行逗号
  • linux中使用nfs共享文件

    NFS需要使用远程过程调用 RPC 也就是说 我们并不是只要启动NFS 还需要启动RPC这个服务 服务器端 CentOS 7 4 ip 172 16 0 1 共享 tmp目录 共享 data目录给172 16 0 2 安装nfs yum i
  • Android中View绘制流程以及invalidate()等相关方法分析

    转载请注明出处 http blog csdn net qinjuning 前言 本文是我读 Android内核剖析 第13章 View工作原理总结而成的 在此膜拜下作者 同时真挚地向渴望了解 Android 框架层的网友 推荐这本书 希望你
  • WMS中Binder案例

    WMS中Binder案例 1 FWK层中AIDL形式 1 1 服务端实现Stub 1 2 客户端获取proxy 2 紧密相关SurfaceFlinger android12 release 1 FWK层中AIDL形式 Android 接口定
  • 示波器信号波形数据处理分析(周期、占空比、Skew等等) 软件函数分享,二次开发SDK

    这个作者我们一起学习是pianzi
  • 人工智能安全的核心观点:何时、为何、何事以及如何

    我们创立 Anthropic 是因为我们相信人工智能的影响可能与工业和科学革命的影响相当 但我们不相信它会顺利进行 而且我们还相信 这种程度的影响可能很快就会到来 也许在未来十年内 这种观点听起来难以置信或夸大其词 并且有充分的理由对此表示
  • 性能测试之cpu的性能诊断

    一 CPU基本知识 测试中CPU诊断是重要的性能指标 CPU是代码打交道最多的硬件之一 要想一个CPU工作就需要提供一些指令和数据 一般放在内存中 其中指令一般都是由代码编译而来 数据也是代码中需用到的 如int char 程序需要执行的部
  • Python中如何查看Pandas DataFrame对象列的最大值、最小值、平均值、标准差、中位数等

    如何查看Pandas DataFrame对象列的最大值 最小值 平均值 标准差 中位数等 我们举个例子说明一下 先创建一个dataframe对象df 内容如下 1 使用sum函数获得函数列的和 用法 df sum 2 使用max获取最大值
  • Qt中的主窗口QMainWindow

    GUI应用程序都有一个主窗口 虽然前面讲到的QWidget组件也可以定义生成主窗口 但是Qt还定义了一个专门用于实现主窗口的类QMainWindow 为什么 跟QDialog一样的道理 主窗口具有许多主窗口特有的元素组件 为了程序的复用性
  • 编程常用快捷键和doc命令

    常用快捷键 win r 打开运行 cmd命令行窗口 win e打开我的电脑 ctrl shift esc打开任务管理器 doc命令 打开doc win r 输入cmd shift右键任意文件夹选择在此处运行powershell窗口 在资源管
  • 【网站数据统计解决方案】快速了解pv、uv、spm、utm_source、埋点等知识

    前言 在访问阿里网站或者一些博客网站的时候 发现地址后面跟了 spm 1010 2135 3001 4477这种参数 以及在访问国外网站的时候会跟 utm source google utm medium cpc utm campaign
  • 番茄ToDo帮助文档

    说明 2020年7月开始使用 番茄ToDo App 目标是通过手机App这样的工具提升效率 养成习惯 提升自我管理能力 番茄ToDo帮助文档 什么是番茄ToDo 番茄工作法是简单易行的时间管理方法 是由弗朗西斯科 西里洛于1992年创立的一
  • 如何去除discuz的powered by discuz!代码

    这串代码 很多人都在问这个问题 今天在这里分享一下 方法 步骤 首选在FTP里面找到源文件夹template default common header common htm 右击编辑 2 打开后找到里面的这串代码 3 将后面的 Power
  • 创建和分析二维桁架和梁结构研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及讲解 1 概述 创建和分析二维桁架和梁结构的研究可以涉及
  • python 实现二叉树

    本文不涉及二叉树概念的详细讲解 而着重利用 python 实现二叉树 其中穿插代码讲解 其它数据结构 链表 栈和队列 目录 节点 构造树 层遍历 添加节点 先序遍历 中序遍历 后序遍历 测试 在链表中 一个节点只能有一个后继节点和前驱节点