Python数据结构(树)

news2024/9/23 11:24:30

Python数据结构(树)

树的概念

树(英语: tree)是一种抽象数据类型ADT) 或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:

每个节点有零个或多个子节点;

没有父节点的节点称为根节点;

每一个非根节点有且只有一个父节点;

除了根节点外,每个子头点可以分为多个不相交的子树;

image-20231024163054613

树的术语

节点的度:一个节点含有的子树的个数称为该节点的度;

树的度:一棵树中,最大的节点的度称为树的度;叶节点或终端节点:度为零的节点;

父亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;

孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;

兄弟节点:具有相同父节点的节点互称为兄弟节点;

节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;

树的高度或深度:树中节点的最大层次;

堂兄弟节点:父节点在同一层的节点互为堂兄弟;

节点的祖先:从根到该节点所经分支上的所有节点;

子孙:以某节点为根的子树中任一节点都称为该节点的子孙;

森林:由m (m>=0)棵互不相交的树的集合称为森林;

树的种类

无序树:树中任意节点的子节点之间没有顺序关系,这种树称为无序树,也称为自由树;

有序树:树中任意节点的子节点之间有顺序关系,这种树称为有序树;

​ 二叉树:每个节点最多含有两个子树的树称为二叉树;

​ 完全二叉树:对于一颗二叉树,假设其深度为d(d>1)。除了第d层外,其它 各层的节点数目均已达最大值,且第d层所有节点从左向右连续地紧密排 列,这样的二叉树被称为完全二叉树,其中满二叉树的定义是所有叶节点 都在最底层的完全二叉树;

​ 平衡二叉树(AVL树):当且仅当任何节点的两棵子树的高度差不大于1的二叉 树;

​ 排序二叉树(二叉查找树(英语: Binary Search Tree),也称二叉搜索树、有 序二叉树);

​ 霍夫曼树(用于信息编码):带权路径最短的二又树称为哈夫曼树或最优二叉树;

​ B树:一种对读写操作进行优化的自平衡的二叉查找树,能够保持数据有序, 拥有多余两个子树。

树的存储与表示

顺序存储:将数据结构存储在固定的数组中,然在遍历速度上有一定的优势,但因所占空间比较大,是非主流二叉树。二叉树通常以链式存储。

image-20231024164857248

链式存储:

image-20231024165026875

由于对节点的个数无法掌握,常见树的存储表示都转换成二叉树进行处理,子结点个数最多为2

常见的一些树的应用场景

1.xml,html等,那么编写这些东西的解析器的时候,不可避免用到树

2.路由协议就是使用了树的身去

3.mysql数据库索引

4.文件系统的目录结构

5.所以很多经典的AI算法其实都是树搜索,此外机器学习中的decision tree也是树结构

二叉树

二叉树的基本概念

二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)

二叉树的性质(特性)

性质1:在二又树的第i层上至多有2(i-1)个结点i>0)

性质2:深度为k的二叉树至多有2^k-1个结点(k>0)

性质3:对于任意一棵二叉树,如果其叶结点数为NO,而度数为2的结点总数为N2,则NO=N2+1;

性质4:具有n个结点的完全二叉树的深度必为 log2(n+1)

性质5:对完全二叉树,若从上至下、从左至右编号,则编号为i的结点,其左孩子编号必为2i,其右孩子编号必为2i+1;其双亲的编号必为i/2(i=1时为根除外)

(1)完全二叉树–若设二叉树的高度为h,除第h 层外,其它各层(1~h-1)的结点数都达到最大个数第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。

image-20231024165934923

(2)满二叉树–除了叶子节点每一个节点都有左右子叶切尔叶子节点都处在最底层的二叉树

image-20231024170531731

二叉树的节点表示以及树的创建
class Node(object):
    """树的节点"""
    def __init__(self, item):
        self.elem = item
        self.lchild = None
        self.rchild = None
        
class Tree(object):
    """二叉树"""
    def __init__(self):
        self.root = None
    
    def add(self, item):
        node = Node(item)
        queue = [self.root]
        while queue:
            cur_node = queue.pop(0)
            if cur_node.lchild is None:
                cur_node.lchild = node
                return
            else:
                queue.append(cur_node.lchild}
            if cur_node.rhild is None:
                cur_node.rhild = node
                return
            else:
                queue.append(cur_node.rhild)
二叉树的遍历

树的遍历是树的一种重要的运算。所谓遍历是指对树中所有结点的信息的访问,即依次对树中每个结点访问一次且仅访问一次,我们把这种对所有节点的访问称为遍历 (traversal)。那么树的两种重要的遍历模式是深度优先遍历和广度优先遍历,深度优先一般用递归、广度优先一般用队列。一般情况下能用递归实现的算法大部分也能用堆栈来实现。

深度优先遍历

对于一颗二叉树,深度优先搜索(Depth First Search)是沿看树的深度遍历树的节点,尽可能深的搜索树的分支。

那么深度遍历有重要的三种方法。这三种方式常被用于访问树的节点,它们之间的不同在于访问每个节点的次序不同。这三种遍历分别叫做先序遍历(preorder),中序遍历(inorder) 和后序遍历(postorder)。

1.先序遍历 在先序遍历中,我们先访问根节点,然后递归使用先序遍历访问左子树,再递归使用先序遍历访问右子树
根节点->左子树->右子树

def preorder(self, root):
    """递归实现先序遍历"""
    if root == None:
        return
    print root.elem
    self.preorder(rood.lchild)
    self.preorder(rood.rchild)

2.中序遍历 在中序遍历中,我们递归使用中序遍历访问左子树,然后访问根节点,最后再递归使用中序遍历访问右子树
左子树->根节点->右子树

def inorder(self, root):
    """递归实现中序遍历"""
    if root == None:
        return
    self.inorder(root.lchild)
    print root.elem
    self.inorder(root.rchild)

3.后序遍历 在后序遍历中,我们递归使用后序遍历访问左子树和右子树,最后访问根节点
左子树->右子树->根节点

def postorder(self, root):
    """递归实现后序遍历"""
    if root == None:
        return
    self.postorder(root.lchild)
    self.postorder(root.rchild)
    print root.elem
广度优先遍历(层次遍历)

从树的root开始,从上到下从左到右遍历整个树的节点

def breadth_travel(self, root):
    """利用队列实现树的层次遍历"""
    if root == None:
        return
    queue = []
    queue.append(root)
    while queue:
        node = queue.pop(0)
        print node.elem
        if node.lchild != None:
            queue.append(node.lchild)
        if node.rchild != None:
            queue.append(node.rchi)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Elasticsearch核心技术与实战-05-elasticsearch的安装与简单配置-Windows

首先下载elasticsearch的zip包:下载地址 网络不通的解决方法:国内镜像站 es、kibana、logstash均可在华为云开元镜像站自行选择版本下载:下载地址 下载插件包: .\bin\elasticsearch-plugin install analysis-icu .\bin\elasti…

ORB-SLAM系列算法相关介绍(综合版)

一、参考资料 ORB-SLAM2详解(一)简介 (公开课)视觉SLAM原理与ORB-SLAM3系列算法 二、相关介绍 1. ORB简介 ORB指的是一种旋转不变性特征。 2. ORB-SLAM系列算法的演进 三、ORB-SLAM 论文:ORB-SLAM: A Versatile …

php使用lunar实现农历、阳历、节日等功能

lunar是一个支持阳历、阴历、佛历和道历的日历工具库,它开源免费,有多种开发语言的版本,不依赖第三方,支持阳历、阴历、佛历、道历、儒略日的相互转换,还支持星座、干支、生肖等。仅供参考,切勿迷信。 官…

相机卡格式化了还能恢复吗?答案在这!(附带恢复教程)

“天啊!和朋友出去旅行拍了好多美美的照片,在传照片的时候不小心点到了格式化,相机里所有的照片都被清空了!这可怎么办呀?相机卡被格式化了还有机会恢复吗?” 相机的存储卡通常会保存我们很多美好的记忆&am…

某网站互动数据采集

1,网址 aHR0cHM6Ly9uZXdzLmZ1dHVubi5jb20vcG9zdC8zMzE4MzE1OQ2,找到返回互动数的请求包 3,采集互动数据加密信息如下 4,察看抓到的包,不难发现futu-offline-csrf-v2和futu-x-csrf-token-v2这两个参数在首页的请求中有…

vue2.0项目中组件和iframe之间如何传值

vue2.0项目中组件和iframe之间如何传值 一、vue组件二、iframe组件 一、vue组件 mounted() {// 注册 message 事件监听器,只注册一次window.addEventListener(message, this.handleFromIframeMessage) }, beforeDestroy() {// 移除事件监听器window.removeEventList…

测开( 进阶篇)

目录 按测试对象进行划分 界面测试 可靠性测试 容错性 灾难恢复性测试 - 了解即可 文档测试 兼容性测试 易用性测试 安装卸载测试 安全测试 性能测试 内存泄漏测试 实战 - 微信发红包的测试用例 按是否查看代码划分 黑盒测试(Black-box Testing) 白盒测试(Whit…

02333软件工程串讲

完整笔记在语雀 https://www.yuque.com/huangzhanqi/nrt1l4/zoa0g0osnrmog0xdhttps://www.yuque.com/huangzhanqi/nrt1l4/zoa0g0osnrmog0xd 《软件工程》串讲讲义 应考指导 一、课程介绍 1、课程性质 《软件工程》是全国高等教育自学考试计算机及应用(独立本科…

Leo赠书活动-01期 【Python数据挖掘——入门进阶与实用案例分析】

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 赠书活动专栏 ✨特色专栏:…

隧道代理 vs 普通代理:哪种更适合您的爬虫应用?

前言 随着互联网的普及,爬虫技术在多个领域得到广泛应用。在进行爬虫开发时,代理服务器是不可或缺的工具之一。代理服务器可以隐藏客户端的真实 IP 地址和位置,从而保护客户端的隐私,同时通过代理可以绕过一些网络限制和安全机制…

重生奇迹mu血色城堡攻略教程

重生奇迹mu血色城堡所需道具 血色城堡位于冰风谷的基地内,具体坐标是209,30,玩家找到此处大天使的使者后,与其对话并携带好相应的道具,便能在活动开启后进入血色城堡。进入城堡需要与你等级对应的透明披风&#xff0c…

再获Gartner权威认可!安全狗作为CWPP代表厂商入选《2023中国网络安全技术成熟度曲线》报告

近日,国际权威研究机构Gartner发布了《2023中国网络安全技术成熟度曲线》(Hype Cycle for Security in China,2023)报告。 作为国内云原生安全领导厂商,安全狗也凭借综合且全面的云工作负载安全技术与实力,…

13. 机器学习 - 数据集的处理

文章目录 Training data splitNormalizationStandardizedONE-HOT补充:SOFTMAX 和 CROSS-ENTROPY Hi, 你好。我是茶桁。 上一节课,咱们讲解了『拟合』,了解了什么是过拟合,什么是欠拟合。也说过,如果大家以…

【AGC】更新应用信息报未知错误解决方法

【问题描述】 最近有几个开发者遇到了一个问题,他们在AGC控制台配置好应用信息的图标和截图之后,点击保存按钮会弹出“未知错误,请稍后再试”的异常报错,导致无法正确保存应用配置信息。 出错页面如图所示。 ​​ 【解决方案】 …

基于springboot+vue实现地方美食分享网站项目【项目源码+论文说明】计算机毕业设计

基于springbootvue实现地方美食分享网站演示 摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求…

linux网络测试命令

文章目录 一.route命令解释二.traceroute命令三.nslookup命令四.本地主机映射文件五.修改网络配置文件六.设置网络接口参数 一.route命令解释 Destination(目标):这一列显示要路由的目标网络或主机的IP地址。它标识了数据包要发送到的目的地。…

Python连接SQL SEVER数据库全流程

背景介绍 在数据分析领域,经常需要从数据库中获取数据进行分析和处理。而SQL Server是一种常用的关系型数据库管理系统,因此学习如何使用Python连接SQL Server数据库并获取数据是非常有用的。 以下是Python使用pymssql连接SQL Server数据库的全流程&a…

学习并了解MQ消息队列

消息队列 消息队列是什么 服务端⾸先需要考虑的是它的稳定性这⼀层,但是在⾼并发的情况下,对服务端的稳定性造成很⼤的破坏性,那么就需要⼀个缓冲的机制,⽽消息队列在异步通信的模式下,使⽤异步处理请求来缓解系统的…

zadig libusb-win32 驱动回退至 FTDIBUS

背景 在windows下,利用FT2232/4232H,结合pyftdi开发时。需要将ftdi默认驱动通过zadig工具更改为libusb-win32。详见如下链接: https://eblot.github.io/pyftdi/installation.html 若此时需要回到libMPSSE开发模式,则驱动无法正确…

转载--关闭onenote2013 /中点击超链接(指向本地文件夹)后出现的安全声明 / Microsoft onenote2021 安全声明关闭

作者:匿名用户 链接:https://www.zhihu.com/question/32472113/answer/133076766以下为内容: 早上看到 第22条军规 的答案,果然很牛逼,感谢您。然后发现他的答案下面有人说不会用,所以我就写了一个包含图…