当前位置: 首页 > news >正文

【Python 数据结构 10.二叉树】

目录

一、二叉树的基本概念

1.二叉树的定义

2.二叉树的特点

3.特殊的二叉树

Ⅰ、斜树

Ⅱ、满二叉树

Ⅲ、完全二叉树

Ⅳ、完全二叉树和满二叉树的区别

4.二叉树的性质

5.二叉树的顺序存储

Ⅰ、完全二叉树

Ⅱ、非完全二叉树

Ⅲ、稀疏二叉树

6.二叉树的链式存储

7.二叉树的遍历概念

8.二叉树的前序遍历

9.二叉树的中序遍历

10.二叉树的后序遍历

11.二叉树的层序遍历

二、Python中的二叉树

1.树的结点定义

2.树的定义

Ⅰ、初始化

Ⅱ、根据给定的结点ID从树结构中获取对应的结点

Ⅲ、访问函数,打印元素结点值

Ⅳ、根据数组创建二叉树

Ⅴ、先序遍历

Ⅵ、中序遍历

Ⅶ、后序遍历

三、实战

1.144. 二叉树的前序遍历

方法一 递归

思路与算法

​编辑

方法二 用栈 Stack 实现迭代遍历

思路与算法

2.94. 二叉树的中序遍历

方法一 递归

思路与算法

方法二 用栈实现迭代 

思路与算法

3.145. 二叉树的后序遍历

方法一 递归

思路与算法

方法二 用栈实现迭代 

思路与算法


等你读懂了相遇的意义,有了隔阂别放弃

                                                        —— 25.3.8

一、二叉树的基本概念

1.二叉树的定义

        二叉树是 n(n ≥ 0) 个结点组成的有限集合,这个集合要么是空集(当 n 等于 0 时),要么是由一个根节点和两棵互不相交的二叉树组成,其中这两棵互不相交的二叉树被称为根节点的左子树和右子树

        如图所示,2 是 1 的左子树,3 是 1 的右子树;同时,4 和 5 分别是 2 的左右子树,6 和 7分别是 3 的左右子树


2.二叉树的特点

        二叉树是一种树,它有如下几个特征:

        ① 每个结点最多二棵子树,即每个结点的孩子结点个数为 0、1、2.

        ② 这两棵子树是有顺序的,分别叫:左子树 和 右子树,就像左手和右手一样,是不能颠倒
的。

        ③ 如果只有一棵子树的情况,也需要区分顺序,如图所示:

b 是 a 的左子树         c 是 a 的右子树


3.特殊的二叉树

Ⅰ、斜树

        所有结点都只有左子树的二叉树,被称为左斜树

        所有结点都只有右子树的二叉树,被称为右斜树

        斜树有点类似 线性表,所以线性表可以理解为一种特殊形式的树


Ⅱ、满二叉树

        对于一棵二叉树,如果它的所有根结点和内部结点都存在左右子树,且所有叶子结点都在同一层,这样的树就是满二叉树

满二叉树有如下几个特点

        ① 叶子节点一定在最后一层

        ② 非叶子结点的度为 2

        ③ 深度相同的二叉树中,满二叉树的结点个数最多,为 2 ^ h - 1(其中 h 代表树的深度)


Ⅲ、完全二叉树

        对一颗具有 n 个结点的二叉树,按照层序进行编号,如果编号 i 的结点 和 同样深度的满二叉树中的编号 i 的结点在二叉树中,位置完全相同则被称为 完全二叉树


Ⅳ、完全二叉树和满二叉树的区别

        满二叉树一定是完全二叉树,而完全二叉树则不一定是满二叉树,完全二叉树有如下几个特
点:

        ① 叶子结点只能出现在最下面两层

        ② 最下层的叶子结点,一定是集中在左边的连续位置,倒数第二层如果有叶子结点一定集中在右边的连续位置

        ③ 如果某个结点度为 1,则只有左子树,即 不存在只有右子树 的情况

        ④ 同样结点数的二叉树,完全二叉树的深度最小

        如下图所示,就不是一棵完全二叉树,因为5号结点没有右子树,但是6号结点是有左子树的,不满足上述第 2 点。


4.二叉树的性质

        ① 二叉树的第 i (i >= 1) 层上最多 2 ^ (i - 1) 个结点;

        ② 深度为 h 的二叉树至多 2 ^ h - 1 个结点;

        ③ n个结点的完全二叉树的深度为 floor(log2n) + 1(其中 floor(x) 代表对 x 取下整);


5.二叉树的顺序存储

        二叉树的顺序存储就是指:利用顺序表对二叉树进行存储。结点的存储位置即顺序表的索引,能够体现结点之间的逻辑关系比如父结点和孩子结点之间的关系,左右兄弟结点之间的关系 等。

Ⅰ、完全二叉树

        编号代表了顺序表索引的绝对位置,映射后如下:

        为了方便,将顺序表索引为 0 的位置留空

        当知道某个结点在顺序表中的索引 x,就可以知道它左右儿子的索引分别为 2x 和 2x + 1.反之,当知道某个结点的索引 x,也能知道其父节点的索引为 floor(x / 2)


Ⅱ、非完全二叉树

        对于非完全二叉树,只需要将对应不存在的结点设置为空即可

        编号代表了顺序表索引的绝对位置,映射后如下:


Ⅲ、稀疏二叉树

        对于较为稀疏的二叉树,就会有如下情况出现,这时候如果用这种方式进行存储,就比较浪费内存了

        编号代表了顺序表索引的绝对位置,映射后如下:

        这种情况下,为了提升内存利用率,我们可以采用链表进行存储


6.二叉树的链式存储

        二叉树每个结点至多有两个孩子结点,所以对于每个结点设置一个数据域(data) 和 两个指针域(left 和 right) 即可。指针域 分别指向 左孩子结点 和 右孩子结点。


7.二叉树的遍历概念

        二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点访问一次且仅被访问一次。

        对于线性表的遍历,要么从头到尾,要么从尾到头,遍历方式较为单纯。但是树不一样,它的每个结点都有可能有两个孩子结点,所以遍历的顺序面临着不同的选择。

        二叉树的常用遍历方法,有以下四种:前序遍历、中序遍历、后序遍历、层序遍历。

        编号代表了顺序表索引的绝对位置,映射后如下:


8.二叉树的前序遍历

        如果二叉树为空则直接返回,否则先访问根结点,再递归前序遍历左子树,再递归前序遍历右子树(根、左、右)前序遍历的结果如下:a、b、d、g、h、c、e、f、i


9.二叉树的中序遍历

        如果二叉树为空则直接返回,否则先递归中序遍历左子树,再访问根结点,再递归中序遍历右子树(左、根、右)中序遍历的结果如下:g、d、h、b、a、e、c、i、f


10.二叉树的后序遍历

        如果二叉树为空则直接返回,否则先递归后遍历左子树,再递归后序遍历右子树,再访问根结点(左、右、根)后序遍历的结果如下:g、h、d、b、e、i、f、c、a


11.二叉树的层序遍历

        如果二叉树为空直接返回,否则依次从树的第一层开始,从上至下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。图中二叉树层序遍历的结果为:a、b、c、d、e、f、g、h、i


二、Python中的二叉树

1.树的结点定义

val:存放当前结点的value值

left:存放当前节点的左孩子

right:存放当前节点的右孩子 

class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = right

2.树的定义

Ⅰ、初始化

接收参数 maxNodes,传入结点最大数目

列表推导式:

class Tree:def __init__(self, maxNodes):self.root = Noneself.nodes = [TreeNode() for i in range(maxNodes)]self.nodeSize = maxNodes

Ⅱ、根据给定的结点ID从树结构中获取对应的结点

    # 根据给定的节点ID从树结构中获取对应的节点def GetTreeNode(self, id):return self.nodes[id]

Ⅲ、访问函数,打印元素结点值

    # 访问函数,打印元素结点的值def visit(self, node):print(node.val, end=' ')

Ⅳ、根据数组创建二叉树

    # 传入一个数组,根据数组创建二叉树def Create(self, arr, size, nodeId):if nodeId >= size or arr[nodeId] == None:return NonenowNode = self.GetTreeNode(nodeId)nowNode.val = arr[nodeId]nowNode.left = self.Create(arr, size, 2 * nodeId)nowNode.right = self.Create(arr, size, 2 * nodeId + 1)return nowNode

Ⅴ、先序遍历

    # 先序遍历def PreOrder(self, node):if node != None:self.visit(node)self.PreOrder(node.left)self.PreOrder(node.right)def preOrderTraversal(self):self.PreOrder(self.root)print('')

Ⅵ、中序遍历

    # 中序遍历def InOrder(self, node):if node != None:self.InOrder(node.left)self.visit(node)self.InOrder(node.right)def InOrderTraversal(self):self.InOrder(self.root)print('')

Ⅶ、后序遍历

    # 后序遍历def PostOrder(self, node):if node != None:self.PostOrder(node.left)self.PostOrder(node.right)self.visit(node)def PostTraversal(self):self.PostOrder(self.root)print('')

Ⅷ、测试代码 

def Test():arr = [None, 'a', 'b', 'c', 'd', None, 'e', 'f', 'g', 'h', None, None, None, None, 'i']tree = Tree(len(arr))tree.CreateTree(arr)tree.preOrderTraversal()tree.InOrderTraversal()tree.PostTraversal()Test()


三、实战

1.144. 二叉树的前序遍历

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

示例 1:

输入:root = [1,null,2,3]

输出:[1,2,3]

解释:

示例 2:

输入:root = [1,2,3,4,5,null,8,null,null,6,7,9]

输出:[1,2,4,5,6,7,3,8,9]

解释:

示例 3:

输入:root = []

输出:[]

示例 4:

输入:root = [1]

输出:[1]

提示:

  • 树中节点数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

进阶:递归算法很简单,你可以通过迭代算法完成吗?

方法一 递归

思路与算法
  • 前序遍历遵循“根 -> 左 -> 右”的顺序。
  • 递归函数 preorder 的核心逻辑是:
    1. 如果当前节点 root 不为空,则将其值加入结果列表 ret
    2. 递归遍历左子树。
    3. 递归遍历右子树。
  • 递归终止条件是当前节点为空(root is None),此时直接返回。
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def preorder(self, root:Optional[TreeNode], ret:List[int]):if root:ret.append(root.val)self.preorder(root.left, ret)self.preorder(root.right, ret)def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:ret = []self.preorder(root, ret)return ret


方法二 用栈 Stack 实现迭代遍历

思路与算法
  • 前序遍历遵循“根 -> 左 -> 右”的顺序。
  • 使用栈来模拟递归的过程:
    1. 从根节点开始,将当前节点的值加入结果列表 res,并将当前节点入栈。
    2. 遍历左子树,直到左子树为空。
    3. 回溯到上一个节点(通过栈弹出),并遍历其右子树。
  • 重复上述过程,直到栈为空且当前节点为空。


2.94. 二叉树的中序遍历

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

示例 1:

输入:root = [1,null,2,3]
输出:[1,3,2]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

提示:

  • 树中节点数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

进阶: 递归算法很简单,你可以通过迭代算法完成吗?

方法一 递归

思路与算法
  • 后序遍历遵循“左 -> 右 -> 根”的顺序。
  • 递归函数 PostOrder 的核心逻辑是:
    1. 如果当前节点 root 不为空,则递归遍历其左子树。
    2. 递归遍历其右子树。
    3. 将当前节点的值加入结果列表 res
  • 递归终止条件是当前节点为空(root is None),此时直接返回。
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def PostOrder(self, root:Optional[TreeNode], res:List[int]):if root:self.PostOrder(root.left, res)self.PostOrder(root.right, res)res.append(root.val)def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:res = []self.PostOrder(root, res)return res


方法二 用栈实现迭代 

思路与算法
  • 中序遍历遵循“左 -> 根 -> 右”的顺序。
  • 使用栈来模拟递归的过程:
    1. 从根节点开始,将当前节点入栈,并遍历其左子树,直到左子树为空。
    2. 回溯到上一个节点(通过栈弹出),将其值加入结果列表 res
    3. 遍历其右子树。
  • 重复上述过程,直到栈为空且当前节点为空。
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:res, stack = [], []while root or stack:if root:stack.append(root)root = root.leftelse:  root = stack.pop()res.append(root.val)root = root.rightreturn res

 


3.145. 二叉树的后序遍历

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 

示例 1:

输入:root = [1,null,2,3]

输出:[3,2,1]

解释:

示例 2:

输入:root = [1,2,3,4,5,null,8,null,null,6,7,9]

输出:[4,6,7,5,2,9,8,3,1]

解释:

示例 3:

输入:root = []

输出:[]

示例 4:

输入:root = [1]

输出:[1]

提示:

  • 树中节点的数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

进阶:递归算法很简单,你可以通过迭代算法完成吗?

方法一 递归

思路与算法
  • 后序遍历遵循“左 -> 右 -> 根”的顺序。
  • 递归函数 postOrder 的核心逻辑是:
    1. 如果当前节点 root 不为空,则递归遍历其左子树。
    2. 递归遍历其右子树。
    3. 将当前节点的值加入结果列表 res
  • 递归终止条件是当前节点为空(root is None),此时直接返回。
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def postOrder(self, root:TreeNode, res):if root is None:returnself.postOrder(root.left, res)self.postOrder(root.right, res)res.append(root.val)def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:res = []self.postOrder(root, res)return res


方法二 用栈实现迭代 

思路与算法
  • 后序遍历遵循“左 -> 右 -> 根”的顺序。
  • 使用栈来模拟递归的过程:
    1. 从根节点开始,将当前节点入栈,并遍历其左子树,直到左子树为空。
    2. 如果左子树为空,则遍历其右子树。
    3. 回溯到上一个节点(通过栈弹出),将其值加入结果列表 res
    4. 如果当前节点是栈顶节点的左子节点,则继续遍历栈顶节点的右子树;否则,结束当前分支的遍历。
  • 重复上述过程,直到栈为空且当前节点为空。
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:res = []stack = []node = rootwhile stack or node:while node:stack.append(node)if node.left != None:node = node.leftelse:node = node.rightnode = stack.pop()res.append(node.val)if stack and stack[-1].left == node:node = stack[-1].rightelse:node = Nonereturn res

相关文章:

【Python 数据结构 10.二叉树】

目录 一、二叉树的基本概念 1.二叉树的定义 2.二叉树的特点 3.特殊的二叉树 Ⅰ、斜树 Ⅱ、满二叉树 Ⅲ、完全二叉树 Ⅳ、完全二叉树和满二叉树的区别 4.二叉树的性质 5.二叉树的顺序存储 Ⅰ、完全二叉树 Ⅱ、非完全二叉树 Ⅲ、稀疏二叉树 6.二叉树的链式存储 7.二叉树的遍历概念…...

从0开始的操作系统手搓教程27:下一步,实现我们的用户进程

目录 第一步&#xff1a;添加用户进程虚拟空间 准备冲向我们的特权级3&#xff08;用户特权级&#xff09; 讨论下我们创建用户线程的基本步骤 更加详细的分析代码 用户进程的视图 说一说BSS段 继续看process.c中的函数 添加用户线程激活 现在&#xff0c;我们做好了TSS…...

set、LinkedHashSet和TreeSet的区别、Map接口常见方法、Collections 工具类使用

DAY7.2 Java核心基础 想学习Collection、list、ArrayList、Set、HashSet部分的小伙伴可以转到 7.1集合框架、Collection、list、ArrayList、Set、HashSet和LinkedHashSet、判断两个对象是否相等文章查看 set集合 在set集合中&#xff0c;处理LinkedHashSet是有序的&#xf…...

Qt开发:nativeEvent事件的使用

文章目录 一、概述二、nativeEvent 的定义三、Windows 平台示例三、使用nativeEvent监测设备变化 一、概述 Qt 的 nativeEvent 是一个特殊的事件处理机制&#xff0c;允许开发者处理操作系统级别的原生事件。通常&#xff0c;Qt 通过 QEvent 机制来管理事件&#xff0c;但有时…...

鸿蒙Next-应用检测、安装以及企业内部商店的实现

一、企业内部应用检测和更新升级 A应用检测是否安装B应用 canOpenApp():boolean{ try { let link schB://com.example.test/open; // 替换成你目标应用的link串儿 let canOpen bundleManager.canOpenLink(link); console.log("canOpen:"canOpen…...

存量思维和增量思维

在网上看一篇文章&#xff0c;有两种典型的阅读方式。 一种&#xff0c;是挑刺式&#xff0c;眼里只有缺点。 比如&#xff0c;有人不厌其烦地告诉作者&#xff0c;哪段有错别字&#xff0c;哪段不够严谨。 闲得蛋疼。 有这工夫&#xff0c;多看会书&#xff0c;不香么&…...

golang将大接口传递给小接口以及场景

文章目录 golang将大接口传递给小接口背景什么是大接口传递给小接口使用场景 golang将大接口传递给小接口 背景 在 Go 语言中&#xff0c;接口是一种强大的工具&#xff0c;它允许我们定义对象的行为而不关心其具体实现。特别是在复杂的应用程序中&#xff0c;将一个实现了较…...

K8s 1.27.1 实战系列(七)Deployment

一、Deployment介绍 Deployment负责创建和更新应用程序的实例,使Pod拥有多副本,自愈,扩缩容等能力。创建Deployment后,Kubernetes Master 将应用程序实例调度到集群中的各个节点上。如果托管实例的节点关闭或被删除,Deployment控制器会将该实例替换为群集中另一个节点上的…...

Swift系列02-Swift 数据类型系统与内存模型

Swift 是一门现代的、安全的编程语言&#xff0c;其类型系统和内存模型设计对性能和安全性有着重要影响。本文将深入探讨 Swift 的数据类型系统与内存模型&#xff0c;帮助你更好地理解并利用这些特性来优化你的 iOS 应用。本文主要包含&#xff1a; 值类型和引用类型&#xf…...

MySQL中like模糊查询如何优化?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL中like模糊查询如何优化?】面试题。希望对大家有帮助&#xff1b; MySQL中like模糊查询如何优化? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 MySQL 中&#xff0c;LIKE 模糊查询虽然非常常见&#xff0c;…...

用低代码平台集成人工智能:无需专业开发也能实现智能化

引言&#xff1a;人工智能的普及与企业需求 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;越来越多的企业开始意识到其在提升运营效率、优化客户体验和推动业务创新方面的巨大潜力。从智能客服到自动化决策支持&#xff0c;从数据分析到个性化推荐&#x…...

【使用hexo模板创建个人博客网站】

使用hexo模板创建个人博客网站 环境准备node安装hexo安装ssh配置 使用hexo命令搭建个人博客网站hexo命令 部署到github创建仓库修改_config.yml文件 编写博客主题扩展 环境准备 node安装 进入node官网安装node.js 使用node -v检查是否安装成功 安装成功后应该出现如上界面 …...

最简单圆形进度条实现CSS+javascript,两端带圆弧

两端是弧形的圆形进度条。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title…...

vuejs 模板语法、条件渲染、v-for、事件处理、表单输入绑定

创建vue项目之后我们就可以开始写代码了&#xff0c;我们的代码一般都会写在src目录-components目录-HelloWord.vue文件内。 我们之前写的HTML文件的结构是HTML代码可以集成或者连接外部的css/js文件。 我们通过vue建立的项目&#xff0c;它的结构是在一个vue文件内集成了HTML…...

论文阅读方法

文章目录 步骤一&#xff1a;对论文进行自我判断阅读题目和关键词。阅读摘要阅读总结要点 步骤二&#xff1a;阅读文章阅读图表和图表的注释阅读引言阅读实验部分阅读结果和作者对结果的讨论&#xff08;创新点&#xff09;要点 步骤三&#xff1a;精度论文回答问题1回答问题2回…...

问题解决:Kali Linux 中配置启用 Vim 复制粘贴功能

在 Kali Linux 系统中&#xff0c;使用 XShell 或其他类似终端时&#xff0c;Vim 编辑器的默认设置并不支持直接进行复制和粘贴操作&#xff0c;这对于日常的开发工作或渗透测试人员来说可能会造成不便。幸运的是&#xff0c;通过简单的配置调整&#xff0c;可以让 Vim 轻松支持…...

Linux hexdump命令

hexdump 是 Linux 中一个强大的二进制文件查看工具&#xff0c;可以用于查看文件的十六进制、ASCII 或其他格式的转储内容。以下是常见用法及示例&#xff1a; 1. 查看文件头部&#xff08;前 N 个字节&#xff09; 语法 hexdump -n <字节数> -C <文件名>示例&am…...

Stable Diffusion教程|快速入门SD绘画原理与安装

什么是Stable Diffusion&#xff0c;什么是炼丹师&#xff1f;根据市场研究机构预测&#xff0c;到2025年全球AI绘画市场规模将达到100亿美元&#xff0c;其中Stable Diffusion&#xff08;简称SD&#xff09;作为一种先进的图像生成技术之一&#xff0c;市场份额也在不断增长&…...

系统架构设计师—系统架构设计篇—微服务架构

文章目录 概述优势挑战 概述 微服务是一种架构风格&#xff0c;将单体应用划分成一组小的服务&#xff0c;服务之间相互协作&#xff0c;实现业务功能&#xff0c;每个服务运营在独立的进程中&#xff0c;服务间采用轻量级的通信机制协作&#xff08;通常是HTTP/JSON&#xff0…...

Array and string offset access syntax with curly braces is deprecated

警告信息 “Array and string offset access syntax with curly braces is deprecated” 是 PHP 中的一个弃用警告&#xff08;Deprecation Notice&#xff09;&#xff0c;表明在 PHP 中使用花括号 {} 来访问数组或字符串的偏移量已经被标记为过时。 背景 在 PHP 的早期版本…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...