关于Python实现树结构和链表结构的一点想法

Python由于内置的数据结构具有很高的灵活性,所以可以用很多种方式来构建树、图、链表等结构

1. 树的Python实现

python自然可以使用class来创建Node结点类和Trie类,然后通过left和right属性保存Node结点来实现树

Python也可以使用字典来嵌套生成树,字典的Key作为当前结点,字典的Value为子树。

但需要注意的是,字典的value是一个字典,那么这个value字典中可以有多个Key,那么每个Key之间是互相为兄弟关系的。

同理,如列表等数据结构,也可以通过嵌套来生成树

在使用字典创建树时,可以重复利用dict的方法setdefault(key,default),如果key存在,则返回value,若不存在,则插入key:default并返回default

--------------------------

比较有意思的是对于树而言,在哪里存他的数据会有很多的不同,对于不同场景酌情实现

假设是使用class实现的字母前缀树,那么可以把字母值保存在当前Node结点的value中,那么这样匹配一个单词的时候,需要遍历所有的子节点找到对应值是否存在,这样在某一层上就多花了k的时间(由于字典自带哈希,所以字典实现的前缀树查找会很快,是O(1)的时间)

也可以把字母值保存在连向子结点的连线上

由于字母前缀树每个结点最多只有26种取值,所以可以提前存一个初始化为26个None的列表,如果在b的位置有值,那么在第二个位置存子结点的Node,这样就实现了把字母值存在连向子结点的连线上。

同时,匹配一个单词的时候,直接来判断这个位置是None还是存在Node结点就可以直接找到下一个结点了,也是O(1)的时间,但是如果树很深,但是很窄的话,这样会浪费许多空间

所以针对不同的场景需求,可以自行选择存储数据的位置,有不同的效果。

利用字典实现树代码如下

#利用字典实现前缀树

trie = {}

# 建立字典实现的字母前缀树

for word in words:

cur = trie

for alpha in word:

cur=cur.setdefault(alpha,{})

2. 链表的Python实现

python本身的列表已经很好用了,在python的标准库中没有链接列表的实现,如果需要大量插入和删除还是需要手动实现一下的,可以实现O(k)的增删查找复杂度

链表实现自然也可以用class来创建Node结点类和Trie类,在Trie类中创建head与tail的Node对象,就可以进行追踪了

如果需要O(1)的查找以及增删复杂度的链表,那么需要配合哈希与双向链表实现、那么在Trie类中还需要添加一个dict哈希来进行节点位置的追踪,key为Node节点的Key(Node节点属性有Key、value、next、pre),Value为该Node节点

#配合哈希与双向链表实现O(1)的查找以及增删复杂度

class Node:

def __init__(self,key,value):

self.key=key

self.value=value

self.next=None

self.pre=None

class LRUCache:

def __init__(self, capacity: int):

self.dic=dict()

self.capacity=capacity

self.size=0

self.head=Node(-1,-1)

self.tail=Node(-1,-1)

self.head.next=self.tail

self.tail.pre=self.head

def get(self, key: int) -> int:

if(key in self.dic):

new_node = Node(key, self.dic[key].value)

# 删除旧节点

del_node = self.dic[key]

del_node.pre.next = del_node.next

del_node.next.pre = del_node.pre

# 添加新节点到头部

new_node.pre = self.head

new_node.next = self.head.next

self.head.next.pre = new_node

self.head.next = new_node

self.dic[key]=new_node

return self.dic[key].value

else:

return -1

def put(self, key: int, value: int) -> None:

new_node = Node(key, value)

# 添加新节点到头部

new_node.pre = self.head

new_node.next = self.head.next

self.head.next.pre = new_node

self.head.next = new_node

if(key in self.dic):

del_node=self.dic[key]

del_node.pre.next=del_node.next

del_node.next.pre=del_node.pre

else:

# 如果key不在链表中,才考虑删去尾元素或者更改size

if(self.size==self.capacity):

# 如果满了,要删去尾部节点

self.dic.pop(self.tail.pre.key)

self.tail.pre.pre.next=self.tail

self.tail.pre=self.tail.pre.pre

else:

self.size+=1

self.dic[key] = new_node

原文:https://www.cnblogs.com/heyjjjjj/p/13837283.html

python链表和树实验报告_关于Python实现树结构和链表结构的一点想法相关推荐

  1. python链表和树实验报告_数据结构树和森林实验报告

    _ 树和森林应用实验 实验报告 实验目的 ( 1) 掌握树和森林的二叉链表表示方法. (2) 掌握树和二叉树的结构及算法之间的对应关系. (3) 掌握树的两种遍历算法及其应用. 实验运行环境 Visu ...

  2. python学生成绩管理系统实验报告_【python 学生信息管理系统】

    1. 简述 本文讲述的是用 python 语言写一个简单的学生信息管理系统,系统包含学生信息的增删查改功.同时使用了 mysql5.7.14 来存储数据. 2.准备工作 首先,先搭建好自己的 MySQ ...

  3. python爬虫豆瓣评论实验报告_用python实现豆瓣短评通用爬虫(登录、爬取、可视化分析)...

    原创技术公众号:bigsai 前言 在本人上的一门课中,老师对每个小组有个任务要求,介绍和完成一个小模块.工具知识的使用.然而我所在的组刚好遇到的是python爬虫的小课题. 心想这不是很简单嘛,搞啥 ...

  4. python数据分析实验报告_用Python处理实验数据

    开篇语 近来忙于考试以及应付专业课,基本很少写简书了.昨晚攻坚了三个学生工作的任务(妈妈的吻.好久没有这么疯狂工作了.还是很爽的哦!) 只恨这张图没有标记时间,其实已经是十二点四十多了 今天难得清静, ...

  5. c语言的链表实验总结,链表实现集合实验报告_相关文章专题_写写帮文库

    时间:2019-05-15 10:09:12 作者:admin <数据结构>实验报告二 分校:学号:日期:班级: 姓名: 程序名: L2311.CPP 一.上机实验的问题和要求: 单链表的 ...

  6. python名片管理器实验报告_名片管理系统——实验报告.doc

    名片管理系统--实验报告 网上名片管理系统 数据库和表的建立:(在MySQL中创建数据库test,并在test数据库中建立card.user和recycle表格,其中card和recycle具有相同的 ...

  7. python贪吃蛇的实验报告_贪吃蛇游戏课程设计实验报告

    DOC 可编辑修改 -------- 为你整理各种最新最全办公范文 -------- 双击可以删除 爱心 --- 用心 --- 恒心 贪吃蛇游戏课程设计实验报告 辽 宁 科 技 大 学 课程设计说明书 ...

  8. python数据分析实验报告_使用 Python 3 进行气象数据分析

    项目简介 :本实验将对意大利北部沿海地区的气象数据进行分析与可视化.我们在实验过程中先会运用 Python 中 matplotlib 库的对数据进行图表化处理,最终在图表分析的支持下得出我们的结论. ...

  9. python学生管理系统设计实验报告_学生成绩管理系统实验报告(新鲜出炉)

    C语言课程设计报告 源码下载方式 关注微信公众号 跨时代的jay 回复 学生成绩管理系统 为大家提供一些帮助! 获取链接后复制到浏览器即可下载 课题题目: 学生信息管理系统 班 级: 信卓11801 ...

最新文章

  1. Android 计算器
  2. 宣布EAXY:使Java中的XML更容易
  3. [渝粤教育] 四川信息职业技术学院 高频电子技术 参考 资料
  4. .ai域名注册已经极具投资价值进入火爆期
  5. 国二C语言大题评分,计算机二级C语言题型和评分标准
  6. 0基础学嵌入式:嵌入式linux视频教程免费分享!
  7. power BI电商案例分析
  8. Ubuntu修改/home下各目录为英文
  9. 软件测试面试中90%会遇到的问题:“你会搭建测试环境吗?”
  10. PyTorch 体验感悟
  11. 想不想修真鸿蒙秘术,想不想修真鸿蒙秘诀怎么得 揭开想不想修真秘诀真面目...
  12. windows和linux系统下数据传输工具——tftpd32使用说明
  13. 2022CCPC预选赛C Guess(博弈)
  14. 代码管理 阿里云 云效 设置云效 SSH 公钥 下载代码到本地配置SSH
  15. 12 道腾讯前端面试真题及答案整理
  16. MyBatis-Plus DQL与其他知识点
  17. ITK-图像主轴分析
  18. 【论文分享】★★★「SOTA」小样本图神经网络分类模型 HGNN:Hybrid Graph Neural Networks for Few-Shot Learning
  19. 无人驾驶—激光雷达与相机
  20. Every Tom,Dick and Harry. 不管张三李四。

热门文章

  1. 美团--美团骑手包裹区间分组
  2. 2022 WebRTC发展趋势分析
  3. 联捷俞海乐:从技术leader到CEO视野和责任提升几个维度
  4. 若5G的速度不够:那6G和16K是必然么?
  5. Java基础之equals和==的区别深入解析
  6. http error
  7. ubuntu更换下载源
  8. 大剑无锋之什么是死锁?【面试推荐】
  9. leetcode 622. Design Circular Queue | 641. 设计循环双端队列(Java)
  10. Redis使用场景、Redis线程模型、Redis持久化 - 公开课笔记