还剩58页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
树的基本算法欢迎来到“树的基本算法”课程!本课程将深入探讨树这种重要数据结构的理论与实践我们将从基础概念出发,逐步过渡到高级应用,为您提供全面的学习体验通过本课程,您将掌握树的各种基本算法,并能将其应用于实际问题的解决中让我们一起探索树的奥秘!课程大纲树的基本概念二叉树及其实现12介绍树的定义、特点及应用场景,为后续学习打下基础详细讲解二叉树的结构、分类及存储方式,并通过代码实现二叉树的创建与操作遍历算法特殊树结构34深入剖析深度优先遍历(前序、中序、后序)和广度优先介绍二叉搜索树、AVL树、红黑树等特殊树结构的特点、遍历(层序)的原理与实现,并进行时间复杂度分析操作及应用什么是树?层次化数据结构节点之间的关系现实生活中的树结构应用树是一种层次化的数据结构,由节点和树中的节点通过边连接,形成父子关系树结构在现实生活中有着广泛的应用,边组成,节点之间存在父子关系这种每个节点可以有多个子节点,但只有例如文件系统、组织结构图、网站导航层次结构使得树非常适合表示具有层级一个父节点(根节点除外)这种关系等通过树结构,我们可以清晰地表示关系的数据,如组织结构、文件系统等定义了树的结构和组织方式和管理这些具有层级关系的数据树的基本术语根节点、父节点、子节点叶子节点根节点是树的顶层节点,没有父节点;父节点是连接到子节点的叶子节点是没有子节点的节点,也称为终端节点节点;子节点是父节点直接连接的节点节点深度和高度节点的度节点深度是从根节点到该节点的路径长度;节点高度是从该节点节点的度是该节点拥有的子节点数量到最远叶子节点的路径长度树的性质节点数与边的关系对于任何一棵树,节点数总是比边数多1这是因为除了根节点外,每个节点都有一条边指向其父节点深度与节点数的关系树的深度是指从根节点到最远叶子节点的路径长度树的深度与节点数之间存在一定的关系,例如平衡树的深度通常较小完全二叉树的性质完全二叉树是一种特殊的二叉树,其所有层都被完全填充,除了最后一层可能不是完全填充的,但最后一层的节点都尽可能地集中在左侧二叉树简介定义与特点最多两个子节点左子树与右子树的区别二叉树是一种树形数据结构,其中每个二叉树的每个节点最多只能有两个子节二叉树的左子树和右子树是两个独立的节点最多有两个子节点,分别称为左子点,这是二叉树与其他树形结构的主要二叉树,它们分别位于父节点的左侧和节点和右子节点二叉树的结构简单,区别之一这种限制使得二叉树的结构右侧左子树和右子树可以为空,也可易于实现和操作,因此被广泛应用于计更加规整,便于进行各种算法操作以包含多个节点算机科学中二叉树的分类满二叉树1所有层都被完全填充的二叉树完全二叉树2除了最后一层外,所有层都被完全填充,并且最后一层的节点都尽可能地集中在左侧的二叉树平衡二叉树3左右子树的高度差不超过1的二叉树二叉搜索树4对于每个节点,其左子树中的所有节点的值都小于该节点的值,而其右子树中的所有节点的值都大于该节点的值的二叉树二叉树的存储结构顺序存储链式存储存储方式的优缺点使用数组来存储二叉树的节点这种存使用链表来存储二叉树的节点每个节顺序存储的优点是节省空间,缺点是不储方式适用于完全二叉树,可以有效地点包含数据域和指向左右子节点的指针灵活;链式存储的优点是灵活,缺点是利用存储空间但是,对于非完全二叉这种存储方式可以灵活地表示各种类浪费空间在选择存储方式时,需要根树,会浪费大量的存储空间型的二叉树,但需要额外的存储空间来据具体的应用场景进行权衡存储指针二叉树节点的表示实现实现实现C/C++Java Python在C/C++中,可以使用结构体来表示在Java中,可以使用类来表示二叉树在Python中,可以使用类来表示二叉二叉树节点,结构体包含数据域和指节点,类包含数据域和指向左右子节树节点,类包含数据域和指向左右子向左右子节点的指针点的引用节点的引用Python的灵活性使得二叉树的实现更加简洁创建二叉树手动创建节点从数组构建从字符串构建手动创建节点是指通过代码逐个创建二从数组构建二叉树是指将数组中的元素从字符串构建二叉树是指将字符串中的叉树的节点,并设置节点之间的父子关按照一定的规则转换为二叉树的节点,字符按照一定的规则转换为二叉树的节系这种方式比较繁琐,但可以灵活地并构建二叉树的结构这种方式适用于点,并构建二叉树的结构这种方式适控制二叉树的结构完全二叉树,可以简化二叉树的创建过用于表示具有特定结构的二叉树,例如程表达式树二叉树的基本操作删除节点从二叉树中删除一个节点,需要考虑删2除节点的类型和位置,以及如何调整二插入节点叉树的结构以保持其性质1将一个新节点插入到二叉树中,需要考虑插入的位置和方式,以保持二叉树的查找节点结构和性质在二叉树中查找一个节点,需要根据节点的键值进行搜索,并返回找到的节点3或者空值遍历算法概述深度优先遍历广度优先遍历时间复杂度分析123从根节点开始,沿着一条路径尽可从根节点开始,逐层访问节点,先遍历算法的时间复杂度取决于二叉能深地访问节点,直到到达叶子节访问根节点的所有子节点,然后访树的结构和遍历方式通常情况下点,然后回溯到最近的未访问节点问子节点的子节点,以此类推广,深度优先遍历和广度优先遍历的,继续沿着另一条路径访问深度度优先遍历也称为层序遍历时间复杂度都是On,其中n是二优先遍历包括前序遍历、中序遍历叉树的节点数和后序遍历前序遍历算法步骤先访问根节点,然后访问左子树,最后访问右子树递归实现通过递归调用函数来实现前序遍历,代码简洁易懂非递归实现使用栈来模拟递归过程,实现前序遍历,可以避免递归调用的开销中序遍历算法步骤先访问左子树,然后访问根节点,最后访问右子树递归实现通过递归调用函数来实现中序遍历,代码简洁易懂非递归实现使用栈来模拟递归过程,实现中序遍历,可以避免递归调用的开销后序遍历算法步骤先访问左子树,然后访问右子树,最后访问根节点递归实现通过递归调用函数来实现后序遍历,代码简洁易懂非递归实现使用栈来模拟递归过程,实现后序遍历,可以避免递归调用的开销后序遍历的非递归实现比较复杂层序遍历算法步骤从根节点开始,逐层访问节点,先访问根节点的所有子节点,然后访问子节点的子节点,以此类推队列实现使用队列来存储待访问的节点,按照先进先出的原则进行访问,保证了层序遍历的顺序应用场景层序遍历可以用于查找二叉树的最短路径、判断二叉树是否是完全二叉树等遍历Morris原理介绍实现方法空间复杂度优化Morris遍历是一种空间复杂度为O1的Morris遍历的核心思想是利用叶子节点Morris遍历的空间复杂度为O1,是二二叉树遍历算法,它不需要使用栈或队的空指针来存储前驱节点的信息,从而叉树遍历算法中空间复杂度最低的算法列等辅助数据结构Morris遍历通过修实现遍历过程中的回溯之一Morris遍历适用于对空间复杂度改二叉树的结构来实现遍历,遍历完成要求较高的场景后需要恢复二叉树的结构二叉搜索树()BST查找操作在二叉搜索树中查找一个节点,可以根据节点的键值进行搜索如果键值小于定义与性质2当前节点的值,则在左子树中搜索;如果键值大于当前节点的值,则在右子树二叉搜索树是一种特殊的二叉树,对于中搜索;如果键值等于当前节点的值,每个节点,其左子树中的所有节点的值1则找到目标节点都小于该节点的值,而其右子树中的所有节点的值都大于该节点的值二叉搜插入操作索树的这种性质使得它非常适合进行查找操作在二叉搜索树中插入一个新节点,需要3找到合适的位置,以保持二叉搜索树的性质通常情况下,新节点会被插入到叶子节点的位置的删除操作BST叶子节点删除单子节点删除双子节点删除如果要删除的节点是叶子节点,则直接如果要删除的节点只有一个子节点,则如果要删除的节点有两个子节点,则需删除即可将子节点连接到父节点,然后删除该节要找到该节点的中序后继节点,将后继点节点的值复制到该节点,然后删除后继节点后继节点一定是叶子节点或者只有一个子节点的平衡性BST为什么需要平衡不平衡的后果12二叉搜索树的平衡性是指二叉不平衡的二叉搜索树会导致查树的结构是否均匀如果二叉找、插入和删除操作的效率降搜索树不平衡,则可能退化成低,影响系统的性能链表,导致查找、插入和删除操作的时间复杂度变为On平衡维护策略3为了保证二叉搜索树的平衡性,需要采用一些平衡维护策略,例如AVL树、红黑树等树介绍AVL平衡因子旋转操作自平衡机制AVL树是一种自平衡二叉搜索树,其每AVL树通过旋转操作来保持平衡旋转AVL树的自平衡机制保证了其查找、插个节点的左右子树的高度差不超过1操作包括左旋、右旋、左右旋和右左旋入和删除操作的时间复杂度都是Olog nAVL树通过平衡因子来判断是否需要进行旋转操作平衡因子等于左子树的高度减去右子树的高度树的旋转AVL左旋将一个节点的右子树向左旋转,使其成为该节点的父节点右旋将一个节点的左子树向右旋转,使其成为该节点的父节点左右旋先对一个节点的左子树进行左旋,然后再对该节点进行右旋右左旋先对一个节点的右子树进行右旋,然后再对该节点进行左旋红黑树概述五个基本性质颜色规则12每个节点要么是红色,要么是红黑树通过颜色规则来保证其黑色;根节点是黑色;每个叶平衡性插入和删除操作可能子节点(NIL)是黑色;如果会破坏红黑树的颜色规则,因一个节点是红色,则它的两个此需要进行颜色调整子节点都是黑色;对于每个节点,从该节点到其所有后代叶子节点的简单路径上,黑色节点的数量相同应用场景3红黑树被广泛应用于各种场景,例如Java的TreeMap、Linux的CFS调度器等红黑树的操作插入操作将一个新节点插入到红黑树中,需要考虑插入的位置和颜色,以及如何进行颜色调整以保持红黑树的性质删除操作从红黑树中删除一个节点,需要考虑删除节点的类型和位置,以及如何进行颜色调整以保持红黑树的性质颜色调整红黑树的颜色调整包括变色和旋转变色是指改变节点的颜色,旋转是指改变节点的父子关系树介绍B多路搜索树阶数概念磁盘存储优化B树是一种多路搜索树,其每个节点可以B树的阶数是指每个节点最多拥有的子节B树的结构特点使其非常适合在磁盘上存拥有多个子节点B树被广泛应用于数据点数量B树的阶数越高,其查找效率越储B树可以将多个节点存储在一个磁盘库和文件系统中,用于实现索引高,但存储空间也会增加块中,从而减少磁盘IO的次数,提高查找效率树基础B+结构特点与树的区别数据库应用BB+树是B树的一种变体,其所有数据都B+树与B树的主要区别在于B+树的所有B+树被广泛应用于数据库系统中,用于存储在叶子节点中,而非叶子节点只存数据都存储在叶子节点中,而非叶子节实现索引B+树的结构特点使其非常适储索引信息B+树的叶子节点通过链表点只存储索引信息B+树的叶子节点通合范围查询和排序操作连接,方便范围查询过链表连接,方便范围查询线段树区间查询构建方法更新操作线段树是一种用于解决区间查询问题的线段树的构建过程是一个递归的过程,当需要更新某个区间的值时,需要更新树形数据结构线段树可以将一个区间将一个区间分解成多个子区间,并对每线段树中对应的节点的值,并递归更新分解成多个子区间,并对每个子区间进个子区间进行递归构建其父节点的值行预处理,从而实现快速的区间查询字典树()Trie构建过程字典树的构建过程是将字符串逐个插入到字典树中对于每个字符,如果字典2树中不存在对应的节点,则创建一个新结构特点节点;否则,沿着已有的节点继续插入字典树是一种用于存储字符串的树形数1据结构字典树的每个节点表示一个字符,从根节点到叶子节点的路径表示一查找算法个字符串字典树被广泛应用于字符串在字典树中查找一个字符串,可以沿着搜索和前缀匹配等场景从根节点到叶子节点的路径进行搜索3如果路径上的所有字符都与字符串中的字符匹配,则找到目标字符串;否则,查找失败并查集基本操作路径压缩按秩合并并查集是一种用于解决集合合并和查询路径压缩是一种用于优化并查集查找操按秩合并是一种用于优化并查集合并操问题的树形数据结构并查集的基本操作的技巧路径压缩可以将查找路径上作的技巧按秩合并可以将秩较小的树作包括查找(Find)和合并(Union)的所有节点的父节点都指向根节点,从合并到秩较大的树上,从而减少树的高而减少后续查找操作的时间复杂度度,提高查找效率堆()Heap二叉堆性质1二叉堆是一种特殊的二叉树,满足堆的性质每个节点的值都大于或等于(或小于或等于)其子节点的值二叉堆分为最大堆和最小堆上浮操作2当插入一个新节点到堆中时,需要进行上浮操作,将新节点移动到合适的位置,以保持堆的性质下沉操作3当删除堆顶节点时,需要进行下沉操作,将堆底节点移动到堆顶,然后进行下沉操作,将堆顶节点移动到合适的位置,以保持堆的性质优先队列堆的应用插入操作删除操作优先队列是一种特殊的队列,其每个元将一个新元素插入到优先队列中,需要从优先队列中删除一个元素,通常是删素都具有优先级优先队列可以使用堆根据元素的优先级将其插入到堆中的合除堆顶元素(即优先级最高的元素)来实现堆的堆顶元素具有最高的优先适位置删除堆顶元素后,需要调整堆的结构,级以保持堆的性质哈夫曼树构建算法编码应用压缩原理哈夫曼树是一种用于数据压缩的树形数哈夫曼编码是一种变长编码方式,其编哈夫曼压缩的原理是利用字符出现的频据结构哈夫曼树的构建算法是一种贪码长度与字符的频率成反比哈夫曼编率来分配不同长度的编码出现频率高心算法,其核心思想是将频率较低的字码可以有效地压缩数据,提高数据的传的字符分配较短的编码,出现频率低的符组合成频率较高的字符,从而减少数输效率字符分配较长的编码,从而减少数据的据的存储空间存储空间树的序列化序列化方法反序列化存储格式树的序列化是指将树的结构转换为线性树的反序列化是指将线性结构转换为树树的序列化可以使用不同的存储格式,结构,例如字符串或数组树的序列化的结构树的反序列化可以方便地从磁例如前序遍历序列、中序遍历序列、后可以方便地将树存储到磁盘或通过网络盘或网络中读取树的结构,并重建树序遍历序列或层序遍历序列不同的存传输储格式适用于不同的应用场景最近公共祖先问题定义解决方案优化技巧最近公共祖先(LCA)是指在树中找到两解决最近公共祖先问题可以使用多种算可以使用一些优化技巧来提高最近公共个节点的最近的共同祖先最近公共祖法,例如暴力搜索、倍增算法、Tarjan祖先算法的效率,例如预处理树的深度先是两个节点的所有公共祖先中深度最算法等信息、使用二分查找等大的节点树的路径问题路径和1计算从根节点到叶子节点的路径和最大路径2找到树中具有最大路径和的路径路径计数3计算树中满足特定条件的路径数量二叉树的对称性判断方法递归实现迭代实现判断一棵二叉树是否对称,可以通过比递归实现是一种简洁易懂的判断二叉树迭代实现是一种避免递归调用的判断二较其左子树和右子树是否镜像对称来实对称性的方法递归实现的核心思想是叉树对称性的方法迭代实现通常使用现比较左子树和右子树的对应节点是否相队列或栈来辅助判断等树的构建前序中序重建后序中序重建层序重建++已知二叉树的前序遍历序列和中序遍已知二叉树的后序遍历序列和中序遍已知二叉树的层序遍历序列,可以唯历序列,可以唯一地确定二叉树的结历序列,可以唯一地确定二叉树的结一地确定二叉树的结构可以使用队构可以使用递归算法来实现二叉树构可以使用递归算法来实现二叉树列来实现二叉树的重建的重建的重建二叉树的修剪条件修剪平衡性维护应用场景根据特定的条件,删除二叉树中的某些在修剪二叉树的过程中,需要维护二叉二叉树的修剪可以应用于各种场景,例节点,以满足特定的需求树的平衡性,以保证二叉树的查找效率如过滤不符合条件的数据、优化二叉树的结构等完全二叉树性质节点编号父子关系12完全二叉树的节点可以按照层对于编号为i的节点,其父节序遍历的顺序进行编号,从1点的编号为i/2,其左子节点开始编号的编号为2i,其右子节点的编号为2i+1数组存储3完全二叉树可以使用数组来存储,数组的下标对应节点的编号这种存储方式可以有效地利用存储空间二叉树的镜像实现方法可以使用递归算法来实现二叉树的镜像2递归算法的核心思想是交换每个节点的左右子树,并递归地对左右子树进行问题定义镜像操作1二叉树的镜像是指将二叉树的左右子树进行交换,从而得到一个新的二叉树,该二叉树与原二叉树互为镜像应用场景二叉树的镜像可以应用于各种场景,例3如判断二叉树是否对称、生成二叉树的镜像等树的深度问题最大深度最小深度平均深度计算树的最大深度,即从根节点到最远计算树的最小深度,即从根节点到最近计算树的平均深度,即所有叶子节点到叶子节点的路径长度叶子节点的路径长度根节点的路径长度的平均值二叉树的边界左边界右边界叶子节点找到二叉树的左边界,即从根节点到最找到二叉树的右边界,即从根节点到最找到二叉树的所有叶子节点左侧叶子节点的路径上的所有节点右侧叶子节点的路径上的所有节点树的子结构判断方法判断一棵树是否是另一棵树的子结构,可以通过递归匹配来实现递归匹配的核心思想是比较两棵树的根节点是否相等,如果相等,则递归地比较两棵树的左右子树是否相等递归匹配使用递归算法来判断一棵树是否是另一棵树的子结构,代码简洁易懂应用实例树的子结构判断可以应用于各种场景,例如判断一棵树是否包含另一棵树、查找树中的特定模式等二叉树的展开链表转换原地算法空间优化将二叉树展开成链表,即将二叉树的节可以使用原地算法来实现二叉树的展开原地算法可以有效地优化空间复杂度,点按照前序遍历的顺序连接成一个链表,即不使用额外的存储空间原地算法适用于对空间复杂度要求较高的场景的核心思想是修改二叉树的结构,将左右子树连接成一个链表树的距离问题节点间距离距离和计算树中两个节点之间的距离,计算树中所有节点之间的距离和即两个节点之间的路径长度最远距离找到树中两个节点之间的最远距离,即树的直径二叉搜索树的验证有效性检查中序遍历法范围限定法验证一棵二叉树是否是二叉搜索树,即可以使用中序遍历法来验证二叉搜索树可以使用范围限定法来验证二叉搜索树判断每个节点是否满足二叉搜索树的性的有效性如果中序遍历序列是递增的的有效性范围限定法的核心思想是限质,则该二叉树是二叉搜索树定每个节点的取值范围,如果节点的值不在范围内,则该二叉树不是二叉搜索树平衡二叉树验证特性检查高度计算AVL12验证一棵二叉树是否是AVL树计算二叉树的高度,可以使用,需要检查每个节点的平衡因递归算法来实现递归算法的子是否满足AVL树的性质核心思想是计算左右子树的高度,然后取最大值加1平衡因子3计算每个节点的平衡因子,即左子树的高度减去右子树的高度平衡因子必须满足AVL树的性质-1=平衡因子=1完全二叉树验证节点计数法层序遍历法递归判断可以使用节点计数法来验证一棵二叉树可以使用层序遍历法来验证一棵二叉树可以使用递归算法来判断一棵二叉树是是否是完全二叉树节点计数法的核心是否是完全二叉树层序遍历法的核心否是完全二叉树递归算法的核心思想思想是计算二叉树的节点数量,如果节思想是按照层序遍历的顺序访问二叉树是递归地判断左右子树是否是完全二叉点数量满足完全二叉树的性质,则该二的节点,如果遇到空节点,则该二叉树树,并判断左右子树的高度是否满足完叉树是完全二叉树不是完全二叉树全二叉树的性质树的复制带随机指针如果树的节点带有随机指针,则深拷贝2需要特殊处理需要创建一个新的随机深拷贝指针,并指向新树中对应的节点深拷贝是指创建一个新的树,并将原树1的所有节点的值都复制到新树中深拷贝可以保证新树与原树完全独立,修改优化方案新树不会影响原树可以使用一些优化方案来提高树的复制效率,例如使用迭代算法、使用缓存等3二叉树的可视化打印方法图形展示工具使用可以使用打印方法来可视化二叉树打可以使用图形展示工具来可视化二叉树可以使用各种工具来可视化二叉树,例印方法的核心思想是按照一定的规则打图形展示工具可以将二叉树以图形的如Graphviz、TreeVisualizer等印二叉树的节点,例如按照层序遍历的方式展示出来,方便用户理解二叉树的顺序打印结构实际应用文件系统目录结构树形遍历12文件系统的目录结构可以使用可以使用树形遍历算法来遍历树形结构来表示每个目录对文件系统的目录结构,例如前应一个节点,目录之间的父子序遍历、中序遍历、后序遍历关系对应树的父子关系或层序遍历路径处理3可以使用路径处理算法来处理文件系统的路径,例如查找文件、创建目录、删除文件等实际应用表达式树构建方法计算过程优先级处理表达式树是一种用于表示算术表达式的可以使用树形遍历算法来计算表达式树在构建表达式树的过程中,需要处理运树形数据结构表达式树的构建方法是的值计算过程是从叶子节点开始,逐算符的优先级可以使用栈来辅助构建将运算符作为节点,将操作数作为叶子层向上计算,直到计算到根节点的值表达式树,并按照运算符的优先级构建节点,并按照运算符的优先级构建树的树的结构结构实际应用决策树构建过程决策路径优化策略决策树是一种用于分类和回归的树形模可以使用决策树来进行决策决策路径可以使用一些优化策略来提高决策树的型决策树的构建过程是一种递归的过是从根节点到叶子节点的路径,路径上性能,例如剪枝、特征选择等程,将数据集按照一定的规则划分成多的每个节点表示一个决策规则个子集,并对每个子集递归构建决策树实际应用数据库索引树应用索引优化性能分析B+B+树被广泛应用于数据库系统中,用于可以使用一些索引优化技巧来提高数据可以使用性能分析工具来分析数据库的实现索引B+树的结构特点使其非常适库的查询性能,例如选择合适的索引类性能,并找到性能瓶颈,从而进行优化合范围查询和排序操作型、优化SQL语句等实际应用游戏AI决策树应用状态空间12决策树可以应用于游戏AI中,游戏AI的状态空间是指游戏中用于实现角色的决策行为决所有可能的状态的集合可以策树的每个节点表示一个决策使用树形结构来表示游戏AI的规则,叶子节点表示一个行动状态空间路径规划3可以使用路径规划算法来规划游戏AI的移动路径常见的路径规划算法包括A*算法、Dijkstra算法等复杂度分析时间复杂度分析算法的时间复杂度,即算法执行时间与数据规模之间的关系空间复杂度分析算法的空间复杂度,即算法所需的存储空间与数据规模之间的关系优化方向根据时间复杂度和空间复杂度分析,找到算法的优化方向,例如使用更高效的算法、减少存储空间等常见面试题典型问题解题思路介绍一些典型的树相关的面试题分析面试题的解题思路,帮助学,例如二叉树的遍历、二叉搜索员掌握解题技巧树的查找、AVL树的旋转等注意事项提醒学员在面试中需要注意的事项,例如代码规范、时间复杂度分析等算法优化技巧递归转迭代1将递归算法转换为迭代算法,可以避免递归调用的开销,提高算法的效率空间优化2优化算法的空间复杂度,减少算法所需的存储空间,例如使用原地算法时间优化3优化算法的时间复杂度,减少算法的执行时间,例如使用更高效的算法高级话题展望并行算法分布式树12探讨树相关的并行算法,例如探讨分布式树的构建和应用,并行遍历、并行搜索等例如分布式文件系统、分布式数据库等机器学习应用3探讨树在机器学习中的应用,例如决策树、随机森林等总结回顾核心概念关键算法实践建议回顾树的核心概念,例如树的定义、树回顾树的关键算法,例如二叉树的遍历提供一些实践建议,帮助学员将所学知的性质、二叉树的分类等、二叉搜索树的查找、AVL树的旋转等识应用于实际问题的解决中。
个人认证
优秀文档
获得点赞 0