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

免费注册网站网址制作简单的站点推广方案

免费注册网站网址,制作简单的站点推广方案,软件开发工程师绩效考核表kpi模板,电商网站前台功能模块【数据结构入门指南】二叉树顺序结构: 堆及实现(全程配图,非常经典) 一、前言:二叉树的顺序结构二、堆的概念及结构三、堆的实现(本篇博客以实现小堆为例)3.1 准备工作3.2 初始化3.3 堆的插入3.3.1 向上调…

【数据结构入门指南】二叉树顺序结构: 堆及实现(全程配图,非常经典)

  • 一、前言:二叉树的顺序结构
  • 二、堆的概念及结构
  • 三、堆的实现(本篇博客以实现小堆为例
    • 3.1 准备工作
    • 3.2 初始化
    • 3.3 堆的插入
      • 3.3.1 向上调整算法
    • 3.4 堆的删除
      • 3.4.1 向下调整算法
    • 3.5 堆的判空(<font color=orange>接下的过于简单直接给出带啊吗)
    • 3.6 取堆顶的数据
    • 3.7 堆的个数
    • 3.8 堆的销毁
  • 四、所有代码


在这里插入图片描述


一、前言:二叉树的顺序结构

普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。
 
现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。

在这里插入图片描述


二、堆的概念及结构

堆是一种特殊的数据结构,可以将堆分为大顶堆和小顶堆两种形式。堆中的每个节点都有一个值,并且满足以下两个条件:
 
①:堆的父节点的值总是大于或等于其子节点的值(大顶堆)或者小于或等于其子节点的值(小顶堆)。
②:堆是完全二叉树,即除了最底层外,其他层的节点都是满的,并且最底层的节点都尽量靠左排列。

大(小)堆示意图:

在这里插入图片描述
在这里插入图片描述


三、堆的实现(本篇博客以实现小堆为例

3.1 准备工作

由于堆是通过数组来实现的,所以我们也和顺序表一样,首先要创建一个结构体来存储:数组指针 + 容量 + 存储数据大小

代码实现:

typedef int HPDataType;
typedef struct Heap
{HPDataType* a;//数组指针int size;//存储数据大小int capacity;//容量
}HP;

3.2 初始化

初始化有两种方式:
①:初始化时为数组开辟一定大小空间。②:直接将数组指针置为NULL,插入数据过程中在进一步处理。(本篇博客采用第二种)

代码实现:

void HPInit(HP* php)
{assert(php);php->a = NULL;php->capacity = 0;php->size = 0;
}

3.3 堆的插入

【代码思路】:
①:在插入数据前,我们首先要判断是否要扩容的问题。由于前面初始化时我们直接置空,所以我们先判断容量是否为空。如果为空开4个空间,否则空间扩大到原来的2倍。(为空时,第一次具体开辟多少空间读者可自行选择,本篇博客开4)
②:接下来就是插入数据了!但有一个问题,直接插入数据可能会破坏堆的结构,所以我们采用了向上调整算法

代码:

void HPPush(HP* php, HPDataType x)
{assert(php);//扩容if (php->size == php->capacity){int newcapacity = php->size == 0 ? 4 : php->capacity * 2;HPDataType* tmp = (HPDataType*)realloc(php->a,sizeof(HPDataType) * newcapacity);if (tmp == NULL){perror("malloc fail");exit(-1);}php->a = tmp;php->capacity = newcapacity;}//插入数据php->a[php->size] = x;php->size++;//向上调整AdjustUp(php->a, php->size - 1);
}

3.3.1 向上调整算法

【代码思路】:由于插入数据时,影响的只是插入数据到根节点间的关系。所以我们只需将插入数据通过双亲节点调到合适位置即可
 
Tips:父节点和子节点关系

  • leftchild = parent *2 + 1
  • rightchild = parent * 2 + 2
  • parent = (child - 1)/2

在这里插入图片描述
代码:

void Swap(HPDataType* p1, HPDataType* p2)
{HPDataType tmp = *p1;*p1 = *p2;*p2 = tmp;
}void AdjustUp(HPDataType* a, int child)
{assert(a);int parent = (child - 1) / 2;while (child > 0){if (a[child] < a[parent])//小堆{Swap(&a[child], &a[parent]);child = parent;parent = (child - 1) / 2;}else{break;}		}
}

3.4 堆的删除

【代码思路】:堆的删除默认是头删。删除有两种思路:
 
①:将根节点删除,再将其余数据全部向前移动。但这样做会造成一个问题:挪动覆盖导致父子节点的关系全乱了,需要重新建堆。为了删个数据,重新建堆,得不偿失,所以我们采用下面这种方法。
 
②:将堆顶的1数据和最后一个数据交换,在删除最后一个数据。堆顶数据在通过向下调整算法调到合适位置即可

在这里插入图片描述

代码:

void HPPop(HP* php)
{assert(php);assert(!HPEmpty(php));//非空,还有数据可删。该接口后面实现Swap(&php->a[0], &php->a[php->size - 1]);//交换php->size--;//删除//向下调整AdjustDown(php->a, php->size, 0);
}

3.4.1 向下调整算法

【代码思路】:向下调整算法有一个前提:左右子树必须是一个堆,才能调整。同时还要注意是调大堆还是小堆。
调小堆:堆顶元素和孩子中最小的节点比较,如果父节点大于较小的子节点子,两者交换。不断向下调整到合适位置。(调大堆,和较大孩子比较)

在这里插入图片描述

代码

void AdjustDown(HPDataType* a, int n, int parent)
{assert(a);int child = parent * 2 + 1;//假设左孩子更小while (child < n){//如果有孩子存在,且有孩子更小,则左孩子加1移到右孩子if ((child + 1) < n && a[child] > a[child + 1]){child++;}if (a[parent] > a[child])//交换{Swap(&a[parent], &a[child]);parent = child;child = parent * 2 + 1;}else{//父节点小于较小的子节点,说明已经调到合适位置,此时break跳出break;}}
}

3.5 堆的判空(接下的过于简单直接给出带啊吗)

bool HPEmpty(HP* php)
{return php->size == 0;
}

3.6 取堆顶的数据

	assert(php);assert(!HPEmpty(php));//断言堆中还有元素return php->a[0];

3.7 堆的个数

int HPSize(HP* php)
{assert(php);return php->size;
}

3.8 堆的销毁

void HPDestory(HP* php)
{assert(php);php->a = NULL;php->capacity = php->size = 0;
}

四、所有代码

Heap.h

#pragma once#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <stdbool.h>typedef int HPDataType;
typedef struct Heap
{HPDataType* a;int size;int capacity;
}HP;void HPInit(HP* php);//初始化
void HPPush(HP* php, HPDataType x);//插入数据
void HPPop(HP* php);//删除数据
int HPTop(HP* php);//堆顶元素
bool HPEmpty(HP* php);//判空
int HPSize(HP* php);//数据个数
void HPDestory(HP* php);//销毁

Heap.c

#include "Heap.h"void HPInit(HP* php)
{assert(php);php->a = NULL;php->capacity = 0;php->size = 0;
}void Swap(HPDataType* p1, HPDataType* p2)
{HPDataType tmp = *p1;*p1 = *p2;*p2 = tmp;
}void AdjustUp(HPDataType* a, int child)
{assert(a);int parent = (child - 1) / 2;while (child > 0){if (a[child] < a[parent])//小堆{Swap(&a[child], &a[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}void AdjustDown(HPDataType* a, int n, int parent)
{assert(a);int child = parent * 2 + 1;while (child < n){if ((child + 1) < n && a[child] > a[child + 1]){child++;}if (a[parent] > a[child]){Swap(&a[parent], &a[child]);parent = child;child = parent * 2 + 1;}else{break;}}
}void HPPush(HP* php, HPDataType x)
{assert(php);//扩容if (php->size == php->capacity){int newcapacity = php->size == 0 ? 4 : php->capacity * 2;HPDataType* tmp = (HPDataType*)realloc(php->a,sizeof(HPDataType) * newcapacity);if (tmp == NULL){perror("malloc fail");exit(-1);}php->a = tmp;php->capacity = newcapacity;}php->a[php->size] = x;php->size++;//向上调整AdjustUp(php->a, php->size - 1);
}bool HPEmpty(HP* php)
{return php->size == 0;
}void HPPop(HP* php)
{assert(php);assert(!HPEmpty(php));Swap(&php->a[0], &php->a[php->size - 1]);php->size--;//向下调整AdjustDown(php->a, php->size, 0);
}int HPTop(HP* php)
{assert(php);assert(!HPEmpty(php));return php->a[0];
}int HPSize(HP* php)
{assert(php);return php->size;
}void HPDestory(HP* php)
{assert(php);php->a = NULL;php->capacity = php->size = 0;
}

在这里插入图片描述
在这里插入图片描述

http://www.yayakq.cn/news/745951/

相关文章:

  • 做桌面端还是网站棋牌游戏网站建设费用
  • 精美图表网站推荐云主机上传网站
  • 网站建设公司推荐预装wordpress云主机
  • 网站做优化是什么意思邯郸超速云_网站建设
  • 网站改版怎么弄铜陵做网站的公司
  • dw网站建设教程网站建设 知乎
  • 将二级域名 网站目录多元网站建设
  • 重庆做网站公司有哪些免费推广网站入口2020
  • 网站建设公司注册动画设计师证怎么考
  • wordpress视频外链插件上海seo公司排名
  • 移动端网站开发公司面备案网站建设
  • 自适应网站三套代码做投资类网站服务器
  • php网站开发设计模式今鼎网站建设
  • 建设好网站需要做推广世界500强企业关于优秀员工的12条核心标准
  • 网站备案流程图片wordpress框架分析
  • 商城网站模板建设手机网站自助建
  • 网站开发外包项目网站苏州姑苏区建设局网站
  • 南昌网站设计公司android studio的应用
  • 一个网站费用重庆企业网站制作公司
  • 白银市住房和城乡建设局网站市场营销培训
  • 如何建设 linux 网站韩城建设局网站
  • 南宁网站建公司电话网页源代码和框架源代码
  • 龙岗网络营销网站制作哪里好wordpress修改文章阅读量
  • 网站建设 找vx cp5173股票专业网站
  • 电商网站国内外需求分析c2c模式名词解释
  • 萧山网站制作公司php网站安装说明书
  • 网站建设 微信开发网上商城都有哪些平台
  • 石家庄做标书的网站世界工厂网登录
  • 兰州网站建设推荐q479185700上快wordpress hierarchical
  • 成都销售型网站龙岗做网站公司icxun