小白学习——数据结构与算法基础(基于python)——树

数据结构与算法(python)(数据结构) 整理了数据结构的基础内容,包括列表、栈和队列、链表、哈希表和树的相关知识点 阅读详情

主要记录:树和树的算法
内容来源:书籍、网络和个人总结

1. 理论

1.1 树的由来

1.2 树的三个属性

  1. 层次性,即树是按层级构建的,越笼统就越靠近顶部,越具体则越靠近底部。
  2. 一个节点的所有子节点与另一个节点的所有子节点无关。
  3. 叶子节点都是独一无二的。

1.3 术语

节点
节点是树的基础部分。它可以有自己的名字,我们称作“键”。节点也可以带有附加信息, 我们称作“有效载荷”。

边
边是树的另一个基础部分。两个节点通过一条边相连,表示它们之间存在关系。

路径
路径是由边连接的有序节点列表。

层数
节点 n 的层数是从根节点到 n 的唯一路径长度。(根节点的层数是0。)

高度
树的高度是其中节点层数的最大值。

其它:略

1.4 定义

版本一(节点和边)

树由节点及连接节点的边构成。树有以下属性:

  1. 有一个根节点;
  2. 除根节点外,其他每个节点都与其唯一的父节点相连;
  3. 从根节点到其他每个节点都有且仅有一条路径;
  4. 如果每个节点最多有两个子节点,我们就称这样的树为二叉树。

定义一示意图:
在这里插入图片描述(由节点和边构成的树)

版本二(涉及递归)

一棵树要么为空,要么由一个根节点和零棵或多棵子树构成,子树本身也是一棵树。 每棵子树的根节点通过一条边连到父树的根节点。

定义二示意图:
在这里插入图片描述(由递归定义的树)

2. 实现

实现树的关键在于选择一个好的内部存储技巧。Python 提供两种有意思的方式,第一种称作“列表之列表”,第二种称作“节点与引用”。

2.1 用列表实现树——“列表之列表”

在“列表之列表”的树 中,我们将根节点的值作为列表的第一个元素;第二个元素是代表左子树的列表;第三个元素是 代表右子树的列表。

图示

在这里插入图片描述

代码示例

myTree = ['a',   #root
      ['b',  #left subtree
       ['d', [], []],
       ['e', [], []] ],
      ['c',  #right subtree
       ['f', [], []],
       [] ]
     ]

优点

“列表之列表”表示法的优点:

  1. 子树的结构与树相同,是一种递归数据结构
  2. 很容易扩展到多叉树,仅需要增加列表元素即可(不局限于二叉树)

python 代码实现

通过定义一系列函数来辅助操作嵌套列表:

  1. BinaryTree创建仅有根节点的二叉树
  2. insertLeft/insertRight将新节点插入树中作
    为其直接的左/右子节点
  3. get/setRootVal则取得或返回根节点
  4. getLeft/RightChild返回左/右子树
def BinaryTree(r):          # 创建一个树
    return [r, [], []]


# 插入操作是直接插入到根节点下面的左右子树,若已经存在,则替而代之并将其变为自己的子树
def insertLeft(root, newBranch):          
    t = root.pop(1)                           # 拿出根节点的原子树
    if len(t) > 1:
        root.insert(1, [newBranch, t, []])    # 原子树存在的情况(取而代之并将其变为子树)
    else:
        root.insert(1, [newBranch, [], []])   # 原子树不存在的情况
    return root

def insertRight(root, newBranch):
    t = root.pop(2)
    if len(t) > 1:
        root.insert(2, [newBranch, [], t])
    else:
        root.insert(2,[newBranch, [], []])
    return root



def getRootVal(root):             # 取得根节点值
    return root[0]

def setRootVal(root, newVal):     # 更新根节点值
    root[0] = newVal

def getLeftChild(root):           # 返回左子树值
    return root[1]

def getRightChild(root):          # 返回右子树值
    return root[2]
    

r = BinaryTree(3)                 # 创建根节点为3的树
insertLeft(r, 4)
print(r)
insertLeft(r, 5)
print(r)
insertRight(r, 6)
print(r)
insertRight(r, 7)
print(r)
l = getLeftChild(r)
print(l)

setRootVal(l, 9)
print(r)
insertLeft(l, 11)
print(r) 
print(getRightChild(getRightChild(r)))

2.2 用类和引用实现树

树的第二种表示法是利用节点与引用。我们将定义一个类,其中有根节点和左右子树的属性。
这种表示法遵循面向对象编程范式。

图解

在这里插入图片描述

Python 实现

class BinaryTree:
    def __init__(self, rootObj):
        self.key = rootObj
        self.leftChild = None
        self.rightChild = None

    def insertLeft(self, newNode):                # 两种情况:
        if self.leftChild == None:                # 若原左子节点为空
            self.leftChild = BinaryTree(newNode)  # 则直接将新节点赋值给左子节点
        else:
            t = BinaryTree(newNode)              # 若不为空,则生成新节点
            
            t.leftChild = self.leftChild         # 把原左子节点变成新节点的左子节点
            self.leftChild = t                   # 再把新节点变成原树的左子节点,完成替换(两步顺序不能变)
    def insertRight(self, newNode):
        if self.leftChild == None:
            self.leftChild = newNode
        else:
            t = BinaryTree(newNode)
            
            t.rightChild = self.rightChild
            self.rightChild = t

    def getRightChild(self):
        return self.rightChild
    def getLeftChild(self):
        return self.leftChild
    def setRootVal(self, obj):
        self.key = obj
    def getRootVal(self):
        return self.key

r = BinaryTree('a')
print(r.getRootVal())
print(r.getLeftChild())
r.insertLeft('b')
print(r.getLeftChild())
print(r.getLeftChild().getRootVal())
r.insertRight('c')
print(r.getRightChild())
print(r.getRightChild().getRootVal())
r.getRightChild().setRootVal('hello')
print(r.getRightChild().getRootVal())

3. 应用

解析树(语法树)

树的遍历

对所有节点的访问称为“遍历”,共有 3 种遍历方式,分别 为前序遍历、中序遍历和后序遍历。

前序遍历(根左右)

在前序遍历中,先访问根节点,然后递归地前序遍历左子树,最后递归地前序遍历右子树。

# 前序
def preorder(tree):
    if tree:
        print(tree.getRootVal())
        preorder(tree.getLeftChild())
        preorder(tree.getRightChild())

中序遍历(左根右)

在中序遍历中,先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树。

# 中序       
def inorder(tree):
    if tree:
        preoder(tree.getLeftChild())
        print(tree.getRootVal())
        preoder(tree.getRightChild())

后序遍历 (左右根)

在后序遍历中,先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问根节点。

# 后序        
def postorder(tree):
    if tree: 
        postorder(tree.getLeftChild())
        postorder(tree.getRightChild())
        print(tree.getRootVal())

关于”前”中“后”的简单、本质的理解记忆方式:按照根节点的出现的先后顺序

4.二叉堆

二叉堆的来龙去脉

几个概念

优先列队
列队的重要变体,或说是特殊的“列队”,取出元素的顺序是依照元素的优先权(关键字)大小,而不是元素进入入列队的先后顺序。

平衡二叉树(AVL树)
平衡的二叉树是指,其根节点的左右子树含有数量大致相等 的节点。

完全二叉树
在完全二叉树中,除了最底层,其他每一层的节点都是满的。

二叉堆的由来

针对优先列队问题,考虑使用二叉树来存储结构的思考而来。
二叉堆能够将优先队列的入队和出队复杂度都保 持在O(log n)。

堆的两个特性

  1. 结构性:用数组表示的完全二叉树
    注意两点:
    除了最底层,其他每一层的节点都是满的;
    对于在列表中处于位置 p 的节点来说,它的左子 节点正好处于位置 2p;同理,右子节点处于位置 2p+1

  2. 有序性:任意一节点的关键字是其子树所有节点的最大值(最小值)——最大堆和最小堆。
    注意一点:对于堆中任意元素 x 及其
    父元素 p,p 都不大于 x。

复杂度

可以采用二分搜索算法找到下一个元素的正确插 入位置,时间复杂度约为 O(log n) 。但是,为了在列表的中部插入元素,可能需要移动其他元素, 以为新元素腾出空间,这种操作的时间复杂度为 O(n) 。
因此,将 n 个元素插入堆中的操作为O(n log n) 。然而,如果从完整的列表开始,构建整个堆只需 O(n) 。

二叉堆操作的实现

5.二叉搜索树

——新的ADT Map实施方案

在这里插入图片描述二叉搜索性
二叉搜索树依赖的一个性质:小于父节点的都在左子树中,大于父节点的键则都在右子树中。

代码实现

Python Pygame 制作策略游戏的科技树系统 本文旨在为游戏开发者提供一个完整的策略游戏科技树系统实现方案。科技树数据结构设计科技节点可视化呈现科技解锁逻辑实现资源消耗与科技进度管理科技效果应用机制介绍科技树系统的基本概念和设计原则详细讲解科技树的数据结构和核心算法提供完整的Pygame实现代码分析科技树系统的数学模型展示实际应用场景和优化建议科技树(Tech Tree): 游戏中表示科技发展路径的图形化结构,展示科技之间的依赖关系科技节点(Tech Node): 科技树中的单个科技项目,包含解锁条件和效果。 阅读详情

相关推荐

Python算法学习路线:从数据结构到实战的完整指南

算法是编程的核心,数据结构则是算法的基石,二者关系如同楼层与地基。时间复杂度分析是衡量算法效率的关键度量衡,掌握它能让你从嵌套循环中识别O(n^2)与O(log n)的差异。在Python中,利用内置的字典、集合和标准库,可以快速实现高效逻辑,但也要警惕切片复制、递归深度等暗坑。从LeetCode刷题到日志分析、缓存淘汰等实战场景,算法能力最终体现在解决真实问题上。本文梳理了从基础数据结构到动态规划的系统学习路径,帮助开发者建立从理论到实践的完整能力。

weixin_34072296的博客 224

解析树学习笔记

本文介绍了解析树、抽象语法树以及优化后的解析树的定义和应用。解析树是一种表示语法结构的树形结构,可以用于编译器、解释器、自然语言处理等领域。抽象语法树是从解析树派生出来的树形结构,只保留与程序语义相关的信息。优化后的解析树通常用于提高程序的性能。

m0_72410588的博客 1498

Bertopic库安装(二)

Bertopic库安装

weixin_43392789的博客 4893

高级语言的解析过程---解析树

高级语言的解析过程都依赖于解析树

feidodoxcx的博客 648

西门子S7-200 SMART 实战解析:滑动平均值滤波算法在模拟量信号处理中的应用

本文详细解析了在西门子S7-200 SMART PLC中实现滑动平均值滤波算法的实战应用。通过处理模拟量信号如温度、压力等,该算法有效抑制信号干扰,提升系统稳定性。文章涵盖算法原理、程序框架、信号采集及调试优化,为工业自动化工程师提供实用指南。

gitlab7runner的博客 1152

Nacos2.3.0与vastBase数据库的集成实践指南

本文详细介绍了将Nacos 2.3.0的默认数据库从MySQL迁移至vastBase数据库的完整实践指南。内容涵盖前期环境准备、源码改造、依赖配置、SQL适配、数据库初始化以及最终的编译打包与部署验证,旨在帮助开发者在国产化或特定技术栈场景下,实现微服务配置中心与vastBase数据库的自主可控集成。

plant的博客 273

什么是解析树?What is a Parse Tree?

The Oracle (tm) Users' Co-Operative FAQ What is a Parse Tree? Author's name: Carel-Jan Engel Author's Email: cjpengel.dba

Rebulid Myself 1万+

智能汽车域控制器FOTA升级方案探讨

上文提到的Entry属性,包括Active 属性, Bootable 属性, Successful 属性, Retrycnt 属性 ,Active 属性用于标志槽的优先级,bootloader优先选择Active 属性=1的槽启动,Bootable 属性标志槽可否可启动,Successful 属性标志槽是否成功启动过,Retrycnt 属性标志槽可尝试启动的次数。芯片启动后,首先进入Bootloader阶段,此阶段将读取存储系统的分区属性,根据属性值进行逻辑判断,并确定进入哪个分区,详见流程图。

huibian1234的博客 1570

数据结构与算法(Python版)四十八:树的应用(表达式解析)

树的应用:解析树(语法树) 将树用于表示语言中句子, 可以分析句子的各种语法成分, 对句子的各种成分进行处理 语法分析树主谓宾,定状补 程序设计语言的编译 词法、语法检查从语法树生成目标代码 自然语言处理 机器翻译、语义理解 树的应用: 表达式解析 我们还可以将表达式表示为树结构 叶节点保存操作数,内部节点保存操作符 全括号表达式((7+3)*(5-2)) 由于括号的存在,需要计算*的话,就必须先计算7+3和5-2,表达式层次决定计算的优先级越底层的表达式,优先级越高 树中每个子树都表示一个子表达式

神薯片 2141

OpenClaw 聪明设置指南(真实可用方案)

本文介绍了OpenClaw AI系统的配置与优化指南,主要内容包括:1)基础配置,涵盖初始化流程、安全设置和配置文件位置;2)模型分层策略,推荐主力模型与降级方案;3)性能优化,包括推理加速和内存管理;4)智能提升方法,如人格定义和技能安装;5)高级功能如多Agent协同和Token优化。文章提供了详细的配置命令和参数说明,帮助用户根据需求平衡性能与成本,实现高效AI助手部署。

qq_43344878的博客 709

Chapter 19 Digital Phase-Locked Loops

数字锁相环 Digital Phase-Locked Loops, 就是根据原来时钟信号, 产生新的时钟信号, which is locked or synchronized. (align 参考时钟边沿 or 在中间)

2304_76736886的博客 973

Python数据结构——解析树及树的遍历

解析树 完成树的实现之后,现在我们来看一个例子,告诉你怎么样利用树去解决一些实际问题。在这个章节,我们来研究解析树。解析树常常用于真实世界的结构表示,例如句子或数学表达式。 图 1:一个简单句的解析树 图 1 显示了一个简单句的层级结构。将一个句子表示为一个树,能使我们通过利用子树来处理句子中的每个独立的结构。 图 2: ((7...

weixin_33935505的博客 605

保姆级教程:用Cadence Sigrity Power DC搞定HI3516A板卡电源压降仿真(含常见报错解决)

本文提供了一份详细的Cadence Sigrity Power DC直流压降仿真教程,特别针对HI3516A板卡设计。从环境准备、器件建模到仿真执行和结果解读,全面覆盖了电源完整性分析的关键步骤,并提供了常见报错的解决方案,帮助工程师快速掌握直流压降分析技术。

weixin_42569329的博客 322

python数据结构与算法讲解_[0x00 用Python讲解数据结构与算法] 概览

[0x00 用Python讲解数据结构与算法] 概览

weixin_39778447的博客 187

【推荐100个unity插件】性能极高的逼真爆炸、火焰和烟雾效果——UNI VFX

这是一篇关于Unity中高性能GPU粒子特效插件UNI VFX的使用指南。文章介绍了该插件提供逼真的爆炸、火焰和烟雾效果,支持URP和HDRP渲染管线。主要内容包括:插件安装方法(需预先安装Visual Effect Graph和Shader Graph包)、事件系统使用方法(如create/loop/stop等事件控制)、特效分类(自动结束型和持续型特效)、检视面板配置技巧以及性能优化建议(特别提醒灯光特效对性能的影响较大)。文末还推荐了多个Unity开发相关的专栏内容。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1488

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

数据结构与算法之希尔排序,2024年最新面试必过秘诀

(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。(img-fDYyH6SI-1713253370246)]//如果当前元素大于加上步长后的那个元素。//打印每次排序后的结果。//遍历本组中所有元素。

m0_60606468的博客 477

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

00. 浙大 《 数据结构与算法》——课程目录

DataStructure_Algorithm_ZJU 中国大学慕课上陈越老师和何钦铭老师主讲的数据结构课程课程链接,本项目整理课程相关内容,并利用Python将课程相关作业进行实现,相关视频内容视频链接,具体题目信息可以直接搜索题目名字进行查询。 第一讲 基本概念 通过研究很多例子去理解究竟什么是“数据结构”、为什么在教数据结构的时候要讲算法、以及相关的基本概念和常用术语。希望这次课的学习...

Techblog of HaoWANG 2438

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【零基础】学python数据结构与算法笔记(目录版)

【零基础】学python数据结构与算法笔记(目录版)

weixin_56760882的博客 869

python 数据结构 算法_GitHub - PegasusWang/python_data_structures_and_algorithms: Python 中文数据结构和算法教程...

Python 算法与数据结构视频教程课程简介数据结构和算法是每个程序员需要掌握的基础知识之一,也是面试中跨不过的槛。目前关于 Python 算法和数据结构的系统中文资料比较欠缺,笔者尝试录制视频教程帮助 Python 开发者掌握常用算法和数据结构,提升开发技能。本教程是付费教程(文字内容和代码免费),因为笔者录制的过程中除了购买软件、手写板等硬件之外,业余需要花费很多时间和精力来录制视频、查资料、...

weixin_39938875的博客 403

数据结构代码(python版)

打好“数据结构”这门课程的扎实基础,对于学习其他专业课程是十分有益的。

xl_020123的博客 850

python语言描述兰伯特pdf_数据结构 Python语言描述

在计算机科学中,数据结构是一门进阶性课程,概念抽象,难度较大。Python语言的语法简单,交互性强。用Python来讲解数据结构等主题,比C语言等实现起来更为容易,更为清晰。《数据结构 Python语言描述》第1章简单介绍了Python语言的基础知识和特性。第2章到第4章对抽象数据类型、数据结构、复杂度分析、数组和线性链表结构进行了详细介绍,第5章和第6章重点介绍了面向对象设计的相关知识、第5章包...

weixin_36154762的博客 598

数据结构与算法完全学习指南:从基础到高级的完整路线图

本文提供了数据结构与算法的完整学习路线图,从基础概念到高级主题,涵盖数组、链表、树、图等数据结构,以及搜索、排序、动态规划等核心算法,适合编程初学者和准备技术面试的开发者。

wa_niuniu的博客 413

180+算法与数据结构难题终极指南:从零基础到面试高手

GitHub 加速计划的 algorithms_and_data_structures 项目是一个包含180+算法与数据结构问题的学习资源,使用C++实现,适合从零基础开始学习,帮助用户逐步成长为面试高手。 ## 项目概述:一站式算法学习资源 📚 该项目涵盖了丰富的算法和数据结构领域,包括链表、树、图、动态规划、贪心算法等多个方面。目前已包含188个C++问题和15个Python问题,为不同

gitblog_00411的博客 1035

数据结构和算法学习指南

数据结构的基本存储方式就是链式和顺序两种,基本操作就是增删查改,遍历方式无非迭代和递归。刷算法题建议从「树」分类开始刷,结合框架思维,把这几十道题刷完,对于树结构的理解应该就到位了。这时候去看回溯、动规、分治等算法专题,对思路的理解可能会更加深刻一些。

优快云_430422的博客 272

【算法地图】数据结构与算法 · 文章索引

构建自己的算法地图,是用于逐个算法持续学习,复习记忆。 后续学习过程会持续刷新,整理思路和总结笔记。

runafterhit的博客 599

python数据结构与算法总结

python常用的数据结构与算法就分享到此处,本月涉及数据结构与算法的内容有如下文章: 《数据结构和算法对python意味着什么?》 《顺序表数据结构在python中的应用》 《python实现单向链表数据结构及其基本方法》 《python实现单向循环链表数据结构及其方法》 《python实现双向链表基本结构及其基本方法》 《python实现双向循环链表基本结构及其基本方法》 《py...

python之战 2万+
上一篇: 小白入门PyQt5(1)——了解和环境搭建
下一篇: 使用优快云-markdown编辑器
Robin_Pi
博客等级 码龄9年 2万+粉丝 632原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值