树结构与递归学习笔记二

2024-08-28 23:04
文章标签 学习 笔记 递归 树结构

本文主要是介绍树结构与递归学习笔记二,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 学习内容:

    • 平衡树:
      • AVL树、红黑树的概念及实现原理。
      • 平衡树在搜索和插入操作中的优势。
    • 堆(Heap):
      • 堆的基本概念、二叉堆、堆排序。
      • 优先队列的实现原理及应用场景。
  • 实践:

    • 实现一个简单的AVL树或红黑树,理解自平衡的过程。
    • 实现堆排序,理解其在优先队列中的应用。
1. 平衡树

1.1 平衡树的定义与重要性:

  • 平衡树是一种二叉搜索树,其特性是在执行插入、删除操作后,通过旋转等手段保持树的高度平衡,以保证搜索、插入、删除操作的时间复杂度保持在O(log n)。

1.2 AVL树:

  • AVL树是最早被发明的自平衡二叉搜索树,以其发明者Adelson-Velsky和Landis命名。
  • 特点:
    • 对于任意节点,其左右子树的高度差(平衡因子)最多为1。
    • 每次插入或删除操作后,通过旋转操作(左旋、右旋)来重新平衡树。
  • 旋转操作:
    • 单旋转: 左旋或右旋,用于简单的不平衡情况。
    • 双旋转: 先左旋后右旋或先右旋后左旋,用于复杂的不平衡情况。
  • 优势:
    • 保持平衡后,搜索、插入、删除操作的最坏时间复杂度为O(log n)。

1.3 红黑树:

  • 红黑树是一种更为复杂的自平衡二叉搜索树,广泛应用于各大编程语言的标准库(如Java的TreeMap、C++的std::map)。
  • 特点:
    • 每个节点要么是红色,要么是黑色。
    • 根节点为黑色。
    • 红色节点不能有红色子节点(红色节点的子节点必须为黑色)。
    • 从根节点到所有叶子节点的路径上,黑色节点的数量相同。
  • 旋转与重新着色:
    • 在插入和删除操作后,红黑树通过重新着色和旋转来维持平衡。
  • 优势:
    • 平衡性较AVL树稍差,但插入和删除操作更高效,平均情况下也能保证O(log n)的时间复杂度。

学习要点:

  • AVL树适合需要频繁查找的场景,红黑树适合需要频繁插入和删除的场景。
  • 掌握旋转操作是理解平衡树的关键。

2. 堆(Heap)

2.1 堆的基本概念:

  • 是一种特殊的完全二叉树,分为最大堆最小堆
    • 最大堆: 每个节点的值都大于或等于其子节点的值,堆顶为最大值。
    • 最小堆: 每个节点的值都小于或等于其子节点的值,堆顶为最小值。

2.2 二叉堆:

  • 二叉堆是一种常见的堆的实现,基于数组实现,适合存储在连续内存中的数据。
  • 插入操作:
    • 将新元素添加到堆的末尾,然后上浮调整,以维持堆的性质。
  • 删除操作:
    • 移除堆顶元素,将最后一个元素移到堆顶,然后下沉调整。

2.3 堆排序:

  • 堆排序是一种基于堆的数据排序算法,时间复杂度为O(n log n)。
  • 排序步骤:
    1. 将无序数组构造成一个堆。
    2. 重复从堆顶取出最大元素(对于最大堆),并将其移到数组的末尾,调整堆结构。
  • 优势:
    • 不需要额外的空间(原地排序),适合大数据排序。

2.4 优先队列:

  • 优先队列是一种基于堆的数据结构,用于按优先级处理元素。
  • 应用场景:
    • 任务调度、网络流量管理等需要处理优先级的数据结构。

学习要点:

  • 理解堆的上浮和下沉操作,是实现堆和堆排序的基础。
  • 堆在优先队列中的应用广泛,是理解堆的重要实践内容。

3. 实践部分

3.1 实现AVL树:

  • 实现思路:

    1. 实现基本的二叉搜索树插入和删除操作。
    2. 添加平衡因子的计算和更新。
    3. 实现左旋、右旋、双旋转等平衡操作。
  • 伪代码示例:

    class AVLNode:def __init__(self, key):self.key = keyself.left = Noneself.right = Noneself.height = 1class AVLTree:def insert(self, root, key):# 标准BST插入if not root:return AVLNode(key)if key < root.key:root.left = self.insert(root.left, key)else:root.right = self.insert(root.right, key)# 更新高度root.height = 1 + max(self.get_height(root.left), self.get_height(root.right))# 获取平衡因子balance = self.get_balance(root)# 左左情况if balance > 1 and key < root.left.key:return self.right_rotate(root)# 右右情况if balance < -1 and key > root.right.key:return self.left_rotate(root)# 左右情况if balance > 1 and key > root.left.key:root.left = self.left_rotate(root.left)return self.right_rotate(root)# 右左情况if balance < -1 and key < root.right.key:root.right = self.right_rotate(root.right)return self.left_rotate(root)return root
    

3.2 实现红黑树:

  • 实现思路:
    1. 实现基本的二叉搜索树插入和删除操作。
    2. 添加节点颜色属性。
    3. 实现插入和删除操作后的重新着色和旋转操作。

3.3 实现堆排序:

  • 实现思路:

    1. 构造一个最大堆(或最小堆)。
    2. 重复取出堆顶元素并调整堆。
  • 伪代码示例:

    def heapify(arr, n, i):largest = il = 2 * i + 1r = 2 * i + 2if l < n and arr[i] < arr[l]:largest = lif r < n and arr[largest] < arr[r]:largest = rif largest != i:arr[i], arr[largest] = arr[largest], arr[i]heapify(arr, n, largest)def heap_sort(arr):n = len(arr)# 构造最大堆for i in range(n // 2 - 1, -1, -1):heapify(arr, n, i)# 一个个取出元素for i in range(n-1, 0, -1):arr[i], arr[0] = arr[0], arr[i]heapify(arr, i, 0)
    

这篇关于树结构与递归学习笔记二的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1116140

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件