二叉树的顺序结构及实现

简介: 二叉树的顺序结构及实现

1 二叉树的顺序结构

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

2. 堆的概念及结构

如果有一个关键码的集合K = { , , ,…, },把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足: <= 且 <= ( >= 且 >= ) i = 0,1,2…,则称为小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。

堆的性质:

1.堆中某个节点的值总是不大于或不小于其父节点的值;

2.堆总是一棵完全二叉树

856a1019248d4d3882cc424fe8a94e0f.png

bcce33b8bf4b4bfbb3edf1aba3aff289.png

3 .堆的实现(小堆)

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef int HPDataType;
typedef struct Heap
{
  int* a;
  int size;
  int capacity;
}HP;
void HeapInit(HP* php);
void HeapDestroy(HP* php);
void HeapPush(HP* php, HPDataType x);
// 规定删除堆顶(根节点)
void HeapPop(HP* php);
HPDataType HeapTop(HP* php);
size_t HeapSize(HP* php);
bool HeapEmpty(HP* php);
#define _CRT_SECURE_NO_WARNINGS 1
#include"Heap.h"
void Swap(int* p1, int* p2)
{
  int tmp = *p1;
  *p1 = *p2;
  *p2 = tmp;
}
void AdjustUp(HPDataType* a, int child)
{
  int parent =(child - 1 )/ 2;
  while (child > 0)
  {
    if (a[parent] > a[child])
    {
      Swap(&a[parent], &a[child]);
      child = parent;
      parent = (child - 1) / 2;
    }
    else
      break;
  }
}
void AdjustDown(HPDataType* a, int size,int parent)
{
  int child = parent * 2 + 1;
  while (child<size)
  {
    if (child+1<size&&a[child + 1] < a[child])
    {
      child++;
    }
    if (a[parent] > a[child])
    {
      Swap(&a[parent], &a[child]);
      parent = child;
      child = parent * 2 + 1;
    }
    else
      break;
  }
}
void HeapInit(HP* php)
{
  php->a = NULL;
  php->capacity = 0;
  php->size = 0;
}
void HeapDestroy(HP* php)
{
  free(php->a);
  free(php);
}
HPDataType HeapTop(HP* php)
{
  return php->a[0];
}
size_t HeapSize(HP* php)
{
  return php->size;
}
bool HeapEmpty(HP* php)
{
  return php->size == 0;
}
void HeapPush(HP* php, HPDataType x)
{
  assert(php);
  if (php->capacity == php->size)
  {
    int newcapacity = php->capacity == 0 ? 4 : php->capacity * 2;
    HPDataType* tmp = (HPDataType*)realloc(php->a, sizeof(HPDataType) * newcapacity);
    php->a = tmp;
    php->capacity = newcapacity;
  }
  php->a[php->size++] = x;
  AdjustUp(php->a, php->size-1);
}
void HeapPop(HP* php)
{
  assert(php);
  Swap(&php->a[0], &php->a[php->size - 1]);
  php->size--;
  int parent = 0;
  AdjustDown(php->a, php->size, 0);
}

堆的建立有两个重要算法即向上调整和向下调整法

堆向下调整算法:现在我们给出一个数组,逻辑上看做一颗完全二叉树。我们通过从根节点开始的向下调整算法可以把它调整 成一个小堆。向下调整算法有一个前提:左右子树必须是一个堆,才能调整

向上调整法:

向上调整算法,直到满足堆。


结尾:今天的分享到此结束,喜欢的朋友如果感觉有帮助可以点赞三连支持,咱们共同进步!

目录
相关文章
|
8月前
|
自然语言处理 安全 API
API First:模型驱动的阿里云API保障体系
本文介绍了阿里云在API设计和管理方面的最佳实践。首先,通过API First和模型驱动的方式确保API的安全、稳定和效率。其次,分享了阿里云内部如何使用CloudSpec IDL语言及配套工具保障API质量,并实现自动化生成多语言SDK等工具。接着,描述了API从设计到上线的完整生命周期,包括规范校验、企业级能力接入、测试和发布等环节。最后,展望了未来,强调了持续提升API质量和开源CloudSpec IDL的重要性,以促进社区共建更好的API生态。
|
网络协议 网络架构
OSI 模型和 TCP/IP 模型的异同
OSI 模型和 TCP/IP 模型的异同
304 1
|
JavaScript Java 测试技术
基于SpringBoot+Vue的大学生竞赛管理系统附带文章和源代码
基于SpringBoot+Vue的大学生竞赛管理系统附带文章和源代码
160 0
基于VMD的小波软阈值的局方信号降噪方法研究
基于VMD的小波软阈值的局方信号降噪方法研究
219 1
|
运维 Kubernetes JavaScript
云效产品使用报错问题之gitlab库导入到云效失败如何解决
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
机器学习/深度学习 存储 人工智能
基于人工智能的【预测死亡-心力衰竭】患者模型建立
基于人工智能的【预测死亡-心力衰竭】患者模型建立
305 0
|
安全 Linux 应用服务中间件
搭建Linux环境 云服务器指南
搭建Linux环境 云服务器指南
305 0
|
存储 网络协议 Ubuntu
【远程访问】Linux搭建SVN服务器,并内网穿透实现公网远程访问
由于文档资料越来越多,将所有资料都存放在自己的电脑上容易混淆,并且也不利于分享。这种情况下,考虑将资料上传SVN统一管理,这样一来其他人也能很方便的查略各种资料。
|
机器学习/深度学习
gtsummary|巧合-绘制多种数据汇总表“神器”
gtsummary|巧合-绘制多种数据汇总表“神器”
361 0
|
资源调度 算法 Python
Python Random(随机)原理解析与编程实践
本文介绍Python Random(随机)原理解析与编程实践
492 0