Python中的数据结构

一.堆

堆的建立可以通过导入heapq库来实现

在Python中建立的是最小堆 即heap[k]<=heap[2*k+1]and heap[k]<=heap[2*k+2]

下面是一些 堆使用的方法

heapq.heappush([],加入的元素)   
heapq.heappop(heap)弹出最小的元素  
heapq.nlargest(3,heap)返回最大的三个元素 
heapq.nsmallest(3,heap)返回最小的三个元素  
heapq.heapify(my)  #自动将列表装换成堆

例子:

import heapq ,random

data=list(range(10))
random.shuffle(data)
print(data)
#建堆
heap=[]
for i in data:
    heapq.heappush(heap,i)
heapq.heappush(heap,99)#添加元素99
print(heap)

print(heapq.heappop(heap))  #弹出最小的元素

heapq.heapreplace(heap,3)#替换堆中最小的元素值,并自动重新建堆

print(heapq.nlargest(3,heap)) #返回最大的三个元素
print(heapq.nsmallest(3,heap)) #返回最小的三个元素

my=[2,0,4,3,12,15,5]
heapq.heapify(my)  #自动将列表装换成堆
print(my)

二.队列

通过导入queue模块实现

下面是一些 队列使用的方法

q=queue.Queue(6) #实例化队列   
q.put(1)  #元素入队  
q.get()出队 
q.empty()判断队列是否为空
q.full()判断队列是否为满
import queue

q=queue.Queue(6) #实例化队列

q.put(1)  #元素入队
q.put(3)
q.put(10)

print(q.full())

print(q.get())

3.链表

可以通过列表来模拟.不过多讲解

4.二叉树

自己实现

class TreeNode:
    def __init__(self, key):
        self.key = key
        self.left = None
        self.right = None

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

    def insert(self, key):
        if self.root is None:
            self.root = TreeNode(key)
        else:
            self._insert_recursive(self.root, key)

    def _insert_recursive(self, current_node, key):
        if key < current_node.key:
            if current_node.left is None:
                current_node.left = TreeNode(key)
            else:
                self._insert_recursive(current_node.left, key)
        else:
            if current_node.right is None:
                current_node.right = TreeNode(key)
            else:
                self._insert_recursive(current_node.right, key)

    def search(self, key):
        return self._search_recursive(self.root, key)

    def _search_recursive(self, current_node, key):
        if current_node is None or current_node.key == key:
            return current_node
        elif key < current_node.key:
            return self._search_recursive(current_node.left, key)
        else:
            return self._search_recursive(current_node.right, key)

    def inorder_traversal(self):
        return self._inorder_recursive(self.root)

    def _inorder_recursive(self, current_node):
        result = []
        if current_node:
            result.extend(self._inorder_recursive(current_node.left))
            result.append(current_node.key)
            result.extend(self._inorder_recursive(current_node.right))
        return result

# 使用示例
tree = BinaryTree()
tree.insert(5)
tree.insert(3)
tree.insert(7)
tree.insert(2)
tree.insert(4)
tree.insert(6)
tree.insert(8)

print(tree.inorder_traversal())  # 输出:[2, 3, 4, 5, 6, 7, 8]

# 搜索示例
result = tree.search(4)
if result:
    print(f"Key 4 found: {result.key}")
else:
    print("Key 4 not found")

实现说明:

  1. TreeNode类

    • 表示二叉树中的每个节点,具有一个 key 属性存储节点的值,以及 left 和 right 属性分别指向左子节点和右子节点。
  2. BinaryTree类

    • 使用 root 属性表示树的根节点。
    • insert(key) 方法用于插入新的节点到二叉树中。
    • _insert_recursive(current_node, key) 是递归插入方法,根据节点值大小决定向左子树或右子树插入新节点。
    • search(key) 方法用于搜索特定值的节点。
    • _search_recursive(current_node, key) 是递归搜索方法,根据节点值大小在左子树或右子树中搜索目标节点。
    • inorder_traversal() 方法实现中序遍历,返回一个按升序排列的节点值列表。
    • _inorder_recursive(current_node) 是递归实现的中序遍历方法。
  3. 使用示例

    • 创建一个二叉搜索树(BST),插入一些节点并进行搜索和遍历操作。
    • 输出示例展示了中序遍历的结果,以及如何搜索特定的节点。

这是一个基本的二叉树实现,可以根据需要扩展添加其他操作如删除节点、前序遍历、后序遍历等。

当我们对一个简单的二叉搜索树进行中序遍历时,可以通过以下步骤演示 _inorder_recursive() 方法的执行过程 

初始调用

首先,我们从根节点 5 开始调用 _inorder_recursive() 方法:

  1. 调用 _inorder_recursive(5)

    • current_node 是 5
    • result 初始化为空列表 []
  2. 处理左子树 _inorder_recursive(3)

    • current_node 是 3
    • 调用 _inorder_recursive(3)
  3. 处理左子树 _inorder_recursive(2)

    • current_node 是 2
    • 调用 _inorder_recursive(2)
  4. 返回空列表 [2]_inorder_recursive(3)

    • 现在 result 是 [2]
    • 添加 3,返回 [2, 3] 到 _inorder_recursive(5)
  5. 处理根节点 5

    • 现在 result 是 [2, 3]
    • 添加 5,成为 [2, 3, 5]
  6. 处理右子树 _inorder_recursive(7)

    • current_node 是 7
    • 调用 _inorder_recursive(7)
  7. 处理左子树 _inorder_recursive(6)

    • current_node 是 6
    • 调用 _inorder_recursive(6)
  8. 返回空列表 [6]_inorder_recursive(7)

    • 现在 result 是 [6]
    • 添加 7,返回 [6, 7] 到 _inorder_recursive(5)
  9. 处理根节点 5

    • 现在 result 是 [2, 3, 5, 6, 7]
  10. 处理右子树 8

    • current_node 是 8
    • 调用 _inorder_recursive(8)
  11. 返回空列表 [8]_inorder_recursive(7)

    • 现在 result 是 [6, 7, 8]
    • 返回 [2, 3, 5, 6, 7, 8] 到 _inorder_recursive(5)
  12. 最终结果

    • 最终返回 [2, 3, 4, 5, 6, 7, 8],这是二叉搜索树中序遍历的结果。

5.有向图

from collections import defaultdict


class WeightedGraph:
    def __init__(self):
        self.graph = defaultdict(list)

    def add_edge(self, u, v, weight):
        self.graph[u].append((v, weight))
        # Uncomment below for undirected graph
        # self.graph[v].append((u, weight))

    def print_graph(self):
        for node in self.graph:
            print(f"{node} -> {self.graph[node]}")


# 创建一个新的带权图实例
graph = WeightedGraph()

# 添加带权边
graph.add_edge(0, 1, 4)
graph.add_edge(0, 2, 2)
graph.add_edge(1, 3, 1)
graph.add_edge(2, 3, 3)

# 打印邻接表表示的带权图
graph.print_graph()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/760840.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

无人机赋能自然资源调查

确权 业务挑战 由于测绘人员难以到达现场&#xff0c;确权区域大&#xff0c;传统人工测绘覆盖 不全面&#xff0c;信息不完整 传统测绘成果单一&#xff0c;现场核实难度高&#xff0c;确权采集信息不对称 无人机优势 数据采集效率是人工的10倍以上&#xff0c;可自动将…

【数学建模】 进化计算与群体智能

文章目录 进化计算与群体智能1. 遗传算法理论与实现1.1 遗传算法介绍1.2 遗传算法详细示例流程1) 初始种群2) 适应度评估3) 选择&#xff08;轮盘赌法&#xff09;4) 交叉5) 变异6) 迭代 1.3 遗传算法的实现1.4 scikit-opt 库实现遗传算法1.4.1 求解函数极值代码实现代码说明运…

智能制造 v3.13.14 发布,ERP、MES 更新

智能制造一体化管理系统 [SpringBoot2 - 快速开发平台]&#xff0c;适用于制造业、建筑业、汽车行业、互联网、教育、政府机关等机构的管理。包含文件在线操作、工作日志、多班次考勤、CRM、ERP 进销存、项目管理、EHR、拖拽式生成问卷、日程、笔记、工作计划、行政办公、薪资模…

C++20中的三向比较运算符(three-way comparison operator)

在C20中&#xff0c;引入了一个新的特性&#xff0c;即"三向比较运算符(three-way comparison operator)"&#xff0c;由于其外观&#xff0c;也被称为"宇宙飞船运算符(spaceship operator)"&#xff0c;其符号为<>。目的是简化比较对象的过程。这个…

八爪鱼现金流-032,给用户发邮件提示功能

每个月的 5 号、15 号、25 号的 17:30 工资日&#xff0c;给用户发送邮件&#xff0c;提示记账月报。 您也来记账一笔吧。 然后首页能看到趋势图。 八爪鱼现金流 八爪鱼

使用Petalinux设计linux系统

文章目录 1.通过 Vivado 创建硬件平台&#xff0c;得到 hdf 硬件描述文件2.设置 Petalinux 环境变量3.创建 Petalinux 工程4.配置Petalinux 工程5.配置Linux内核6.配置Linux根文件系统7.配置设备树文件8.编译 Petalinux 工程9.制作BOOT.BIN启动文件10.制作SD启动卡 1.通过 Viva…

智能旅行规划的未来:大模型与形式化验证的融合

我们在做旅行规划时面对众多的目的地选择、复杂的交通连接、预算限制以及个人偏好等多重因素&#xff0c;即使是最有经验的旅行者也可能会陷入选择困境。传统的旅行规划方法往往依赖于人工操作&#xff0c;这不仅耗时耗力&#xff0c;而且难以保证计划的最优性和可执行性。 本…

C++学习笔记---POCO库

在Windows系统中安装POCO 1&#xff09;安装OpenSSL POCO编译安装依赖OpenSSL&#xff0c;如果未安装OpenSSL则应该先安装OpenSSL。 假设将OpenSSL安装在C:\OpenSSL-Win64&#xff0c;将C:\OpenSSL-Win64、C:\OpenSSL-Win64\lib添加到PATH环境变量中2&#xff09;安装POCO 将p…

Java代码生成器(开源版本)

一、在线地址 Java在线代码生成器&#xff1a;在线访问 二、页面截图 三、核心功能 支持Mybatis、MybatisPlus、Jpa代码生成使用 antlr4 解析SQL语句&#xff0c;保证了SQL解析的成功率支持自定义包名、作者名信息支持自定义方法名、接口地址支持自定义选择是否生成某个方法…

前端面试题(基础篇十四)

一、DOMContentLoaded 事件和 Load 事件的区别&#xff1f; 当初始的 HTML 文档被完全加载和解析完成之后&#xff0c;DOMContentLoaded 事件被触发&#xff0c;而无需等待样式表、图像和子框架的加载完成。 Load 事件是当所有资源加载完成后触发的。 二、简述一下你对 HTML 语…

解析桥式整流电路

下面这个桥式整流电路出场率很高&#xff0c;看着一定眼熟。 事实证明&#xff0c;强行灌输的东西总是难以下咽。记得读书那会&#xff0c;第一次看到这个电路时被吓到了&#xff0c;以至于直到这门课结束了也没搞清楚。 本文就来分析一下此电路中电流的走向&#xff0c;进而理…

【初阶数据结构】深入解析队列:探索底层逻辑

&#x1f525;引言 本篇将深入解析队列:探索底层逻辑&#xff0c;理解底层是如何实现并了解该接口实现的优缺点&#xff0c;以便于我们在编写程序灵活地使用该数据结构。 &#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#…

Android经典面试题之Glide的缓存大揭秘

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 Glide缓存 关联类&#xff1a;Engine、LruResourceCache、LruCache、ActiveResources ActiveResources&#xff1a;弱引用缓存池 VisibleForTe…

Chapter8 透明效果——Shader入门精要学习笔记

一、基本概念 在Unity中通常使用两种方法来实现透明效果 透明度测试&#xff08;无法达到真正的半透明效果&#xff09;透明度混合&#xff08;关闭了深度写入&#xff09; 透明度测试 基本原理&#xff1a;设置一个阈值&#xff0c;只要片元的透明度小于阈值&#xff0c;就…

VMware--创建Ubuntu虚拟机

原文网址&#xff1a;VMware--创建Ubuntu虚拟机-CSDN博客 简介 本文介绍VMware创建Ubuntu虚拟机的方法。 VMware是最好用的虚拟机软件&#xff0c;安装方法见&#xff1a; 本文安装当前最新的Ubuntu的LTS镜像&#xff1a;ubuntu2022.04.4LTS。 1.下载Ubuntu镜像 下载地址…

电脑技巧:告别卡顿,迎接流畅——Wintune系统优化软件功能详解

目录 一、Wintune介绍 二、Wintune核心功能介绍 2.1 系统优化 2.2 隐私功能 2.3 文件管理模块 2.4 可选选项 2.5 UWP app服务 2.6 startup Manager 2.7、主机编辑 三、总结 电脑是大家目前日常办公娱乐必不可小的工具&#xff0c;软件市场上的系统优化软件层出不穷&a…

一二三应用开发平台应用开发示例(5)——列表视图、树视图、树表视图、树参照视图配置

列表视图 接下来进入列表视图配置&#xff0c;创建的操作方式跟前面相同&#xff0c;如下图所示&#xff1a; 保存后回到列表&#xff0c;点击行记录的配置按钮&#xff0c;进入如下配置页面 可以看到该配置界面相比新增、修改、查看那三个视图要复杂得多&#xff0c;配置项…

帕金森患者的福音,这些食物竟有神奇疗效!

在忙碌的现代生活中&#xff0c;健康问题越来越受到大家的关注。而帕金森病作为一种常见的老年神经系统疾病&#xff0c;更是让许多患者和家庭倍感压力。但是&#xff0c;你知道吗&#xff1f;除了药物治疗和手术干预&#xff0c;日常饮食也能对帕金森病产生积极的影响。今天&a…

开源分享:一套完整的直播购物系统源码

直播购物已经成为一种炙手可热的电商模式&#xff0c;吸引了无数商家和消费者的目光。对于开发者来说&#xff0c;构建一个功能齐全、用户体验优良的直播购物系统是一项复杂的任务。本文将分享一套完整的直播购物系统源码&#xff0c;帮助开发者快速搭建自己的直播购物平台。 …

基于springboot+vue+uniapp的语言课学习系统小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…