【算法】二叉树(满二叉树和完全二叉树)、堆(堆的向下调整)、堆排序、堆的内置模块heapq

news2025/1/12 6:50:10

1 二叉树
1.1 满二叉树和完全二叉树
1.2 堆的向下调整
2 堆排序
3 堆的内置模块

1 二叉树

二叉树是一种树形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。

二叉树的常见类型包括:
1. **普通二叉树**:任意一种二叉树,没有特定的性质约束。
2. **完全二叉树**:除了最后一层,其他层的节点都是满的,且最后一层的节点尽可能向左排列。
3. **满二叉树**:每一层的节点数都达到最大值,即每个节点要么有两个子节点,要么没有子节点。
4. **平衡二叉树(AVL树)**:一种自平衡的二叉搜索树,任何节点的两个子树的高度差不超过1。
5. **二叉搜索树(BST)**:对于每个节点,左子节点的值小于该节点的值,右子节点的值大于该节点的值。
6. **红黑树**:一种特殊的二叉搜索树,通过额外的“红”或“黑”标记来保持树的平衡,使得最长路径不超过最短路径的两倍。

这些二叉树类型在算法和数据结构中用于实现高效的搜索、排序和数据管理操作。

1.1 满二叉树和完全二叉树

在这里插入图片描述

在这里插入图片描述

1.2 堆的向下调整

在这里插入图片描述

向下调整为下图注意观察树的变化

在这里插入图片描述

2 堆排序

"""
满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。
完全二叉树:叶节点只能出现在最下层的次下层,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树。

二叉树的存储方式:
    链式存储方式
    顺序存储方式

堆:一种特殊的完全二叉树

堆排序(Heap Sort)是一种基于堆数据结构的比较排序算法,具有优良的时间复杂度表现。
堆是一种特殊的完全二叉树结构,可以分为两种类型:
最大堆:每个节点的值都大于或等于其子节点的值。
最小堆:每个节点的值都小于或等于其子节点的值。

堆排序通常使用最大堆来进行排序。
其基本步骤如下:
步骤1:构建最大堆
    首先,将待排序数组构建成最大堆。这一步的目的是将数组中的最大元素移动到根节点(即数组的第一个位置)。
步骤2:交换堆顶元素和最后一个元素
    将堆顶(最大元素)与堆的最后一个元素交换,然后将堆的大小减一,排除最后一个元素,因为它已经处于正确的位置。
步骤3:调整堆
    对堆顶元素进行调整,使剩余的元素仍然保持最大堆的性质。这个过程通常称为“堆化”或“下沉”。
步骤4:重复步骤2和步骤3
    重复步骤2和步骤3,直到所有元素都排好序。

时间复杂度
    堆排序的时间复杂度为 O(nlogn),其中 n 是待排序元素的数量。
    它在最坏、最好和平均情况下的时间复杂度都是 O(nlogn),并且它是一种不稳定的排序算法。
"""


def sift(li: list, low: int, high: int):
    """
    :param li:列表
    :param low:堆的根节点位置
    :param high:堆的最后一个元素的位置
    :return:
    """
    i = low  # i最开始指向根节点
    j = 2 * i + 1  # j开始是左孩子
    tmp = li[low]  # 把堆顶存起来
    while j <= high:  # 只要j位置有数
        if j + 1 <= high and li[j + 1] > li[j]:  # 如果右孩子有并且比较大
            j = j + 1  # j指向右孩子
        if li[j] > tmp:
            li[i] = li[j]
            i = j  # 往下看一层
            j = 2 * i + 1
        else:  # tmp更大,把tmp放到i的位置上
            li[i] = tmp  # 把tmp放到某一级领导位置上
            break
    else:
        li[i] = tmp  # 把tmp放到叶子节点上


def heap_sort(li: list):
    n = len(li)
    for i in range((n - 2) // 2, -1, -1):
        # i表示建堆的时候调整的部分的根的下标
        sift(li, i, n - 1)
    # 建堆完成了
    print(li)
    for i in range(n - 1, -1, -1):
        # i 指向当前堆的最后一个元素
        li[0], li[i] = li[i], li[0]
        sift(li, 0, i - 1)  # i-1是新的high


li = [i for i in range(100)]
import random

random.shuffle(li)
print(li)
heap_sort(li)
print(li)

3 堆的内置模块

import heapq  # q->queue 优先队列
import random

li = list(range(100))
random.shuffle(li)

print(li)

heapq.heapify(li)  # 建堆

n = len(li)
for i in range(n):
    print(heapq.heappop(li), end=',')

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

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

相关文章

在 uboot 中实现 UDP 协议

一、明确背景 uboot中有许多通信协议&#xff0c;像TFTP、NFS等&#xff0c;这些协议底层都是基于UDP协议来实现的&#xff0c;由于有一个板子在 uboot 段进行固件下载更新的需求&#xff0c;本来想基于TCP协议来实现自定义通信协议&#xff08;TCP有自带的拥塞控制和重传机制&…

Microsoft Visual C++ Redistributable的作用主要体现以及可以删除吗?

这些是Microsoft Visual C的不同版本的Redistributable&#xff08;可再发行组件包&#xff09;安装包&#xff0c;用于在用户的计算机上安装或更新必要的运行时库&#xff0c;以便运行使用这些版本的Visual C开发的应用程序。具体来说&#xff1a; Microsoft Visual C 2012 R…

编译linux内核时,让版本号不跟着git变化

文章目录 编译linux内核时&#xff0c;让版本号不跟着git变化现象方法一方法二 编译linux内核时&#xff0c;让版本号不跟着git变化 现象 内核每次重新编译时&#xff0c;uname -r都会跟着变。 4.1.15-00005-g482731e4-dirty 导致报错&#xff0c;modprobe: can’t change …

《深入理解Java虚拟机(第2版)》- 第1章 - 学习笔记

1.1 概述 Java不止是一门编程语言&#xff0c;它是一些列计算机软件和规范所形成的技术体系。 1.2 技术体系 Sun官方定义Java技术体系由5各部分组成&#xff0c;如下&#xff1a; Java编程语言JVMClass文件格式Java API 类库第三方Java类库&#xff08;商业或开源&#xff…

养猫家庭必备好物——宠物空气净化器,让浮毛无处可逃

前不久&#xff0c;我爸妈担心我独自一个人来到一个陌生的城市打拼&#xff0c;身边没人陪我会孤单&#xff0c;但其实我一点儿都不孤单。虽然我家里没有人陪我聊天说话一起做饭&#xff0c;但是有猫陪我。 之前来到这座城市的第二年就养了猫&#xff0c;心情确实好很多&#…

【数据分享】《中国奶业年鉴》2002-2020(缺2014)

而今天要限时免费分享的数据就是2002-2020年间出版的《中国奶业年鉴》并以多格式提供免费下载。&#xff08;无需分享朋友圈即可获取&#xff09; 数据介绍 《中国奶业年鉴》是反映我国奶业发展情况的综合性年刊&#xff0c;也是农业农村部&#xff08;原农业部&#xff0…

13、java 数组常见算法(经典案例)、Arrays类的使用(操作数组工具类)、数组常见异常(角标越界或空指针)

java 数组 Ⅰ、数组常见算法&#xff1a;1、二维数组的案例1&#xff1a;求和其一、代码为&#xff1a;其二、截图为&#xff1a; 2、二维数组的案例2&#xff1a;杨辉三角其一、描述&#xff1a;其二、代码为&#xff1a;其三、截图为&#xff1a; 3、二维数组的案例3&#xf…

如何使用jd-gui对springboot源码进行分析

背景&#xff1a; 最近在学习springboot的过滤器和拦截器&#xff0c;想了解一下过滤器和拦截器是怎么匹配URL的&#xff0c;在网上搜了半天都搜不到针对源码的&#xff0c;网上大部分内容都是说怎么配置过滤器和拦截器&#xff0c;怎么使用&#xff0c;并没有对源码进行分析的…

10分钟出稿!分享最佳6款AI智能一键生成毕业论文

在当前的学术环境中&#xff0c;AI智能写作工具已经成为许多学生和研究人员的重要助手。这些工具不仅能够帮助快速生成论文初稿&#xff0c;还能提供文献综述、语法检查等多种功能&#xff0c;极大地简化了学术写作流程。以下是六款最佳AI智能一键生成毕业论文的推荐&#xff1…

大学生实用工具!分享5款靠谱AI一键生成毕业论文的网站

对于大学生来说&#xff0c;毕业论文是一项重要的学术任务&#xff0c;但往往也是最令人头疼的部分。幸运的是&#xff0c;随着人工智能技术的发展&#xff0c;现在有一些工具可以帮助学生轻松完成论文。以下是五款靠谱的AI一键生成毕业论文的网站&#xff0c;其中特别推荐千笔…

EXCEL格式转化

1.小数位的保留 ROUND 四舍五入&#xff0c; ROUNDUP向上进一位 ROUNDDOWN向下进一位 2.货币符号与单位的添加 CTRLSHIFT4自定义格式&#xff0c;只改变显示&#xff0c;不改变数值 DOLLAR,RMB 3.英文大小写转化 UPPER小写变大写 LOWER大写变小写 PROPER首字母大写 …

ArcGIS JSAPI 高级教程 - ArcGIS Maps SDK for JavaScript - 自定义范围后处理效果(优化版)

ArcGIS JSAPI 高级教程 - ArcGIS Maps SDK for JavaScript - 自定义范围后处理效果&#xff08;优化版&#xff09; 核心代码完整代码在线示例 ArcGIS Maps SDK for JavaScript 从 4.29 开始增加 RenderNode 类&#xff0c;可以添加数据以及操作 FBO&#xff08;ManagedFBO&…

微信公众号扫码登录

开发前准备 微信公众平台微信公众平台&#xff0c;给个人、企业和组织提供业务服务与用户管理能力的全新服务平台。https://mp.weixin.qq.com/申请注册个服务号&#xff0c;并且需要微信认证&#xff0c;注意个人公众号无法开通这个功能&#xff0c;因为个人就不给做微信认证。…

Python | Leetcode Python题解之第350题两个数组的交集II

题目&#xff1a; 题解&#xff1a; class Solution:def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:nums1.sort()nums2.sort()length1, length2 len(nums1), len(nums2)intersection list()index1 index2 0while index1 < length1 and ind…

LLM 中 100K 上下文窗口背后的秘密

最近有几则关于新型大型语言模型 (LLM) 的公告&#xff0c;这些模型可以使用极大的上下文窗口&#xff0c;例如65K 个标记&#xff08;MosaicML 的MPT-7B-StoryWriter-65k &#xff09;甚至100K 个标记&#xff08; Antropic 的引入 100K 上下文窗口&#xff09;。在 Palm-2技术…

C++ | Leetcode C++题解之第354题俄罗斯套娃信封问题

题目&#xff1a; 题解&#xff1a; class Solution { public:int maxEnvelopes(vector<vector<int>>& envelopes) {if (envelopes.empty()) {return 0;}int n envelopes.size();sort(envelopes.begin(), envelopes.end(), [](const auto& e1, const aut…

一招制胜!Spring Boot、Prometheus和Grafana三剑合璧,称霸监控领域!

1. 添加Prometheus和Actuator依赖 在pom.xml中添加Spring Boot Actuator和Micrometer Prometheus依赖&#xff1a; <dependencies> <!--监控功能Actuator--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring…

光伏电站气象站:提升电站效益,智能监控

随着全球对可持续发展和清洁能源需求的日益增长&#xff0c;光伏发电作为一种清洁、可再生的能源形式&#xff0c;正逐步成为能源结构转型的重要支柱。然而&#xff0c;光伏系统的发电效率直接受到气候条件的影响&#xff0c;如光照强度、温度、湿度、风速及风向等。因此&#…

网上商城购物系统

TOC springboot0752网上商城购物系统 第1章 绪论 1.1背景及意义 随着社会的快速发展&#xff0c;计算机的影响是全面且深入的。人们生活水平的不断提高&#xff0c;日常生活中人们对网上商城购物系统方面的要求也在不断提高&#xff0c;购物的人数更是不断增加&#xff0c;…

Kubernetes--深入Pod

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 出自B站博主教程笔记&#xff1a; ​​​​​​​完整版Kubernetes&#xff08;K8S&#xff09;全套入门微服务实战项目&#xff0c;带你一站式深入…