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

随机推荐

  • 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 实现二叉树 其中穿插代码讲解 其它数据结构 链表 栈和队列 目录 节点 构造树 层遍历 添加节点 先序遍历 中序遍历 后序遍历 测试 在链表中 一个节点只能有一个后继节点和前驱节点