二叉树的数学性质、最大堆的实现

news2024/11/30 10:37:52

在这里插入图片描述

每层个数的通式

第一层: 2 0 第二层: 2 1 第三层: 2 2 第四层: 2 3 每层个数的通式 2 n − 1 个, n 为层数 \begin{aligned} 第一层:2^0 \\ 第二层:2^1 \\ 第三层:2^2 \\ 第四层:2^3 \\ \\ 每层个数的通式 \\ 2^{n-1} 个,n 为层数 \end{aligned} 第一层:20第二层:21第三层:22第四层:23每层个数的通式2n1个,n为层数

总节点个数计算:

等比数列求和公式: a 1 ( 1 − q n ) 1 − q 总节点个数计算: 1 ( 1 − 2 2 ) 1 − 2 = 2 n − 1 \begin{aligned} 等比数列求和公式:\frac{a_1(1-q^n)}{1-q} \\ \\ 总节点个数计算:\\ \frac{1(1-2^2)}{1-2} \\ =2^n - 1 \end{aligned} 等比数列求和公式:1qa1(1qn)总节点个数计算:121(122)=2n1

【总节点个数】与【最底层个数】的关系

总节点个数  2 n − 1  与每层个数  2 n − 1  之间的关系 2 n − 1 = 2 × 2 n − 1 − 1 即:总节点个数 = 2 × 最底层节点数 − 1 \begin{aligned} 总节点个数 ~ 2^n - 1 ~ 与 每层个数 ~ 2^{n-1} ~ 之间的关系 \\ 2^n - 1 = 2 \times 2^{n-1} -1 \\ 即:总节点个数 = 2 \times 最底层节点数 - 1 \end{aligned} 总节点个数 2n1 与每层个数 2n1 之间的关系2n1=2×2n11即:总节点个数=2×最底层节点数1

为何左节点下表为 2i + 1

在这里插入图片描述
第 x 层,【假设节点】的下标
= 第 x − 1 层 x - 1 层 x1的所有节点数 + a
= ( 2 x − 1 − 1 ) + a (2^{x-1}-1) + a (2x11)+a

x-1 层总节点个数 + 假设节点左侧具有的节点数 a

同理可得 【左节点】的下标
= ( 2 x − 1 ) + 2 a (2^{x}-1) + 2a (2x1)+2a

x 层总节点个数 + 假设节点左侧具有的节点数 2a

【假设节点】的下标【左节点】的下标 之间的关系
2 × 【假设节点】的下标 = 2 × [ ( 2 x − 1 − 1 ) + a ] = 2 x − 2 + 2 a ∴ 【左节点】的下标 = ( 2 x − 1 ) + 2 a = 2 × 【假设节点】的下标 + 1 \begin{aligned} 2 \times 【假设节点】的下标\\ = 2\times [(2^{x-1}-1) + a] \\ = 2^{x} - 2+ 2a \\ \\ \therefore 【左节点】的下标= (2^{x}-1) + 2a \\ = 2 \times 【假设节点】的下标+ 1 \end{aligned} 2×【假设节点】的下标=2×[(2x11)+a]=2x2+2a【左节点】的下标=(2x1)+2a=2×【假设节点】的下标+1
右节点下标,只需在左节点下标基础上 + 1,即: 2 i + 2 2i + 2 2i+2


最大堆(特殊的二叉树)

二叉树:每个节点最多有两个子节点
二叉堆:任意节点的值都大于等于(或小于等于)其左右子节点的值;

最大堆:任意节点的值,都大于等于其左右子节点的值

基本思路:

  • 将待排序的元素,构建成一个二叉堆
  • 依次将堆顶元素取出来,放到已排序的序列
  • 再将剩余的元素重新构建成一个新的堆

Java 代码实现

public static void heapSort(int[] arr) {
    int size = arr.length;

    // 构建最大堆
    // 中间,但靠近左边
    int centerLeft = size / 2 - 1;
    for (int i = centerLeft; i >= 0; i--) {
        heapify(arr, size, i);
    }

    // 依次取出堆顶元素,放到已排序的序列中
    for (int i = size - 1; i >= 0; i--) {
        // 将堆顶元素与最后一个元素交换
        int temp = arr[0];
        arr[0] = arr[i];
        arr[i] = temp;

        // 从 size - 1 开始,重新构建最大堆
      	// heapify 函数中,index 超过 heapSize 的元素,将会被忽略比较
        heapify(arr, i, 0);
    }
}

// 以 nodeIndex 为根节点的子树构建成最大堆(上浮)
public static void heapify(int[] arr, int heapSize, int nodeIndex) {
    int largest = nodeIndex; // 初始化最大值为根节点
    int left = 2 * nodeIndex + 1; // 左子节点
    int right = 2 * nodeIndex + 2; // 右子节点

    // 如果左子节点比根节点大,则更新最大值为左子节点
    if (left < heapSize && arr[left] > arr[largest]) {
        largest = left;
    }

    // 如果右子节点比最大值还大,则更新最大值为右子节点
    if (right < heapSize && arr[right] > arr[largest]) {
        largest = right;
    }

    // 如果最大值不是根节点,则交换根节点和最大值,继续递归构建最大堆
    if (largest != nodeIndex) {
        int temp = arr[nodeIndex];  // nodeIndex 为原来最大值的位置
        arr[nodeIndex] = arr[largest]; // nodeIndex 修改为现在最大值的位置
        arr[largest] = temp;  // largest 为【小的】位置

        heapify(arr, heapSize, largest);  // 继续对【小的】,进行 heapify
    }
}

public static void main(String[] args) {
    int[] arr = {12, 11, 13, 5, 6, 7};
    heapSort(arr);
    System.out.println(Arrays.toString(arr));
}

构建最大堆时,中间,但靠近左边的解释:
紫色的为要堆化的元素

在这里插入图片描述

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

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

相关文章

linux历史记录简易审计系统

1、有时候我们需要对线上用户的操作进行记录,可以进行追踪,出现问题追究责任,但是linux自带的history并不会实时的记录(仅仅在内存中,当用户正常退出(exit logout )时才会记录到history文件里),并且还有1000行的限制可以删除的&#xff1b; 为了保证让用户的操作进行实时记录&…

chatgpt赋能python:Python入门:如何下载NumPy库

Python入门&#xff1a;如何下载NumPy库 如果你是Python初学者或是有开发经验的工程师&#xff0c;你可能会涉及到使用NumPy库。NumPy是Python中一个非常重要的科学计算库&#xff0c;它提供了高效的多维数组数据结构和数学函数&#xff0c;被许多人用于数据分析、机器学习、科…

Verilog基础:task和function的使用(二)

相关文章 Verilog基础&#xff1a;表达式位宽的确定&#xff08;位宽拓展&#xff09; Verilog基础&#xff1a;表达式符号的确定 Verilog基础&#xff1a;数据类型 Verilog基础&#xff1a;位宽拓展和有符号数运算的联系 Verilog基础&#xff1a;case、casex、ca…

CSS的学习1

使用css的目的是让网页具有美观一致的页面。 语法 CSS规则由两个主要的部分构成&#xff1a;选择器以及一条或多条声明&#xff08;样式&#xff09; 选择器&#xff1a;h3 声明&#xff1a;{color:red;font-size:30px;} 选择器通常是需要改变的HTML元素&#xff1b; 每条…

六一儿童节-王者连连看

庆祝六一 用java实现的连连看练手小游戏 王者连连看 &#x1f923; 游戏介绍&#x1f61c; 核心&#x1f62e;‍&#x1f4a8;总结&#xff1a; &#x1f923; 游戏介绍 王者连连看游戏的目标是通过消除相同的图案来得分并进入更高级别的挑战。   游戏分为四个难度   可以自…

cpp: Visitor Pattern

/*****************************************************************//*** \file Gold.h* \brief 访问者模式 Visitor Pattern C 14 行为模式* 2023年6月8日 涂聚文 Geovin Du Visual Studio 2022 edit.文章来源《C新经典设计模式》 王健伟编著 清华大学出版社* \author…

记录:VS2019+OpenCV4.7.0编译

一、准备 OpenCV官网提供了动态库的安装包&#xff0c;但是只有64位&#xff0c;而且没看到编译参数&#xff0c;如果需要32位或者静态链接还是得自己编译。 CMake&#xff1a;https://cmake.org/download/ Visual Studio&#xff1a;https://visualstudio.microsoft.com/zh…

计算机组成原理——中央处理器

文章目录 **一 CPU的功能和基本结构****1 CPU的功能****2 [基本结构](http://t.csdn.cn/bpCt3)****2.1 运算器****2.2 控制器** **二 指令执行过程****1 指令周期****2 指令周期的数据流****2.1 取指周期****2.2 间址周期****2.3 执行周期****2.4 中断周期** **3 指令的执行方案…

chatgpt赋能python:如何下载Python中的jieba包

如何下载Python中的jieba包 随着Python的普及&#xff0c;很多程序员选择使用Python作为自己的主力编程语言。对于自然语言处理方面的任务&#xff0c;jieba是Python中一个非常优秀的分词工具。那么&#xff0c;如何下载和使用Python中的jieba包呢&#xff1f;本篇文章将为您详…

【MySQL数据库 | 第十四篇】多表查询案例

目录 前言&#xff1a; 引入背景&#xff1a; 练习&#xff1a; 前言&#xff1a; 在第十三篇我们已经详细的介绍了多表查询的类别以及每一个类别的语法&#xff1a;【MySQL数据库 | 第十三篇】多表查询&#xff0c;今天我们将通过案例来巩固我们对多表查询语法的熟悉度。 引入…

JavaSE笔记(二)重制版

面向过程篇 前面我们已经认识了Java语言的相关特性&#xff0c;并且已经成功配置好了开发环境&#xff0c;从这节课开始&#xff0c;我们就可以正式进入到Java语言的学习当中了。Java语言是一门面向对象的语言&#xff0c;但是在面向对象之前&#xff0c;我们还得先学会如何面…

【IMX6ULL驱动开发学习】05.IMX6ULL驱动开发_编写第一个hello驱动【熬夜肝】

经过以下四个步骤&#xff0c;终于可以开始驱动开发了 01.安装交叉编译环境【附下载地址】 02.IMX6ULL烧写Linux系统 03.设置IMX6ULL开发板与虚拟机在同一网段 04.IMX6ULL开发板与虚拟机互传文件 目录 一、获取内核、编译内核 二、创建vscode工作区&#xff0c;添加内核目录…

《计算机组成原理》期末考试手写笔记——模块五: 并行主存系统(交叉存储器+顺序存储器“带宽”的计算方法)

目录 &#xff08;一&#xff09;知识点总结 &#xff08;二&#xff09;经典考试例题 1.设主存储器容量为256字&#xff0c;字长为32位&#xff0c;模块数m4&#xff0c;分别用顺序方式和交叉方式进行组织。主存储器的存储周期T200ns&#xff0c;数据总线宽度为32位&#x…

EMQ X(2):EMQ X服务端环境搭建与配置

1 安装 EMQ X 目前支持的操作系统: Centos6Centos7OpenSUSE tumbleweedDebian 8Debian 9Debian 10Ubuntu 14.04Ubuntu 16.04Ubuntu 18.04macOS 10.13macOS 10.14macOS 10.15Windows Server 2019 产品部署建议 Linux 服务器&#xff0c;不推荐 Windows 服务器。 安装的方式有…

【Linux】HTTP协议

目录 &#x1f680;前言&#x1f683;HTTP协议 &#x1f684;1、URL网址&#x1f685;2、URL的编码和解码&#x1f687;3、HTTP协议格式&#x1f688;4、HTTP请求&#x1f689;4.1、 HTTP GET和POST方法&#x1f68b;4.2、HTTP状态码&#x1f68a;4.3、HTTP常见Header &#x1…

redis架构设计: redis-server的启动(硬核分析)

怎么在windows上用clion搭建redis的源码阅读环境 请看我的上一篇文章 redis启动之后都干了什么呢? 我们知道&#xff0c;redis的服务端对应的源码位置是server.c main函数是程序启动的入口 &#xff0c;下面我来一行一行的分析server.c的源码 1、定义时间函数变量 struct …

chatgpt赋能python:Python多种输出格式详解

Python多种输出格式详解 对于Python程序员来说&#xff0c;输出是非常重要的。无论是在开发阶段还是在生产环境中&#xff0c;输出都是我们调试程序和确认程序运行是否正常的重要手段。Python标准库提供了丰富的输出格式&#xff0c;本文介绍了几种常见的输出格式及其使用方法…

因为写不出拖拽移动效果,我恶补了一下Dom中的各种距离

目录 背景 JS Dom各种距离释义 第一个发现 window.devicePixelRatio 的存在 document.body、document.documentElement和window.screen的宽高区别 scrollWidth, scrollLeft, clientWidth关系 元素自身和父级元素的scrollWidth和scrollLeft关系? offsetWidth和clientWid…

【FDA】图像通过傅里叶变换改变光谱风格,实现域自适应

FDA: Fourier Domain Adaptation for Semantic Segmentation, CVPR2020 翻译&#xff1a;CVF2020邻域自适应/语义分割&#xff1a;FDA: Fourier Domain Adaptation for Semantic SegmentationFDA&#xff1a;用于语义分割的傅立叶域自适应算法_傅里叶域适应_HheeFish的博客-CS…

【TCP/IP】多进程服务器的实现(进阶) - 进程和僵尸进程

目录 僵尸(Zombie)进程 僵尸进程的产生机制 僵尸进程的危害 僵尸进程的销毁 wait函数 waitpid函数 进程管理在网络编程中十分重要&#xff0c;如果未处理好&#xff0c;将会导致出现“僵尸进程”&#xff0c;进而影响服务器端对进程的管控。 僵尸(Zombie)进程 第一次听到…