目录

1. 二叉树的顺序结构及实现

1.1 二叉树的顺序结构

1.2 堆的概念及结构

1.3 堆的实现

1.4 堆排序


1. 二叉树的顺序结构及实现

1.1 二叉树的顺序结构

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

1.2 堆的概念及结构

如果将一些元素集合按照完全二叉树的顺序存储方式存储在一个一维数组中,并且满足任意一个节点的值总是不大于或不小于其父节点的值,则将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。

总结堆的性质
        ~堆中某个节点的值总是不大于或不小于其父节点的值;
        ~堆总是一棵完全二叉树

1.3 堆的实现

堆:

typedef int HPDataType;
typedef struct Heap
{HPDataType* a;int size;int capacity;
}HP;

堆的初始化:

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

堆的销毁:

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

堆插入数据:

void AdjustUp(HPDataType* a, int child)//向上调整
{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 HeapPush(HP* php, HPDataType x)
{assert(php);if (php->size == php->capacity){int newcapacity = php->capacity == 0 ? 4 : php->capacity * 2;HPDataType* tmp = (HPDataType*)realloc(php->a, sizeof(HPDataType)*newcapacity);if (tmp == NULL){printf("realloc fail\n");exit(-1);}php->a = tmp;php->capacity = newcapacity;}php->a[php->size] = x;php->size++;AdjustUp(php->a, php->size - 1);
}

堆的删除:

void AdjustDwon(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[child] > a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}void HeapPop(HP* php)
{assert(php);assert(php->size > 0);Swap(&(php->a[0]), &(php->a[php->size - 1]));php->size--;AdjustDwon(php->a, php->size, 0);
}

取堆顶元素:

HPDataType HeapTop(HP* php)
{assert(php);assert(php->size > 0);return php->a[0];
}

判断堆是否为空:

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

求堆中元素个数:

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

1.4 堆排序

void HeapSort(int* a, int n)
{//向上,向下调整时间复杂度均为树高度,即logN// 建堆方式1:O(N*logN)//for (int i = 1; i < n; ++i)//{//   AdjustUp(a, i);//}// 建堆方式2:O(N)for (int i = (n-1-1)/2; i >= 0; --i){AdjustDwon(a, n, i);}// O(N*logN)int end = n - 1;while (end > 0){Swap(&a[0], &a[end]);AdjustDwon(a, end, 0);--end;}
}void TestHeapSort()
{int a[] = { 27, 15, 19, 18, 28, 34, 65, 49, 25, 37 };HeapSort(a, sizeof(a) / sizeof(int));
}int main()
{TestHeapSort();return 0;
}

二叉树的顺序结构及实现相关推荐

  1. 数据结构---二叉树的顺序结构及实现

    二叉树的顺序结构及实现 1. 二叉树的顺序结构 2. 堆的概念及结构 3. 堆的实现 3.1 堆向下调整算法 3.2 堆排序 3.2.1 堆排序完整代码 3.3 堆的插入 3.3.1 堆的向上排序算法 ...

  2. 从零开始学C语言数据结构 : 二叉树的顺序结构

    二叉树的顺序结构 1.树 1.1树的概念 1.2树的表示 1.3二叉树 2.二叉树的顺序结构 1.堆 2.堆的实现 2.1.向下调整 2.2堆的创建--向下调整实现 2.3建堆的时间复杂度 2.4堆的 ...

  3. 数据结构--二叉树的顺序结构及实现

    文章目录 前言 堆 堆的概念以及结构 堆的搭建 堆的实现 前言 普通的二叉树是不适合用数组来存储的,因为这样会存在大量的空间浪费,但是完全二叉树却更适合用顺序结构存储. 堆 堆的概念以及结构 堆的概念 ...

  4. 【C】二叉树--顺序结构(详解堆的实现,topK排序、堆排)、和链式结构(链式结构的遍历、链式结构常见递归操作以及练习题)

    本章我们将引入树的概念并详细介绍二叉树.我们会在介绍顺序二叉树基础上,进一步介绍堆以及堆的实现,并以此为依据详解topK排序.堆排等问题:然后我们会介绍链式二叉树的实现以及各种操作.最后,我们也会给出 ...

  5. 【数据结构总结】第五章 树和二叉树(非线性结构)

    第五章 树和二叉树(非线性结构) 提示:本文主要是以思维导图的形式概括数据结构第一章的精华内容,基本不会用到文字性的内容,目的是为了给大家梳理每个重要的知识点的相关概念,方便大家在复盘的时候快速阅读和 ...

  6. 数据结构 二叉树的存储结构_线程二叉树| 数据结构

    数据结构 二叉树的存储结构 线程二叉树 (Threaded Binary Tree ) A binary tree can be represented by using array represen ...

  7. 再谈二叉树(二叉树概念,二叉树的性质,二叉树的存储结构)

    树的概念 树的概念 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合.把它叫做树是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的.它具有以下的特点 ...

  8. 【数据结构周周练】007顺序结构实现完全二叉树操作- 求编号i与j最近公共祖先结点

    树型结构是数据结构中学到的第一个一对多的结构,是非常重要的非线性结构,也是比较难的一个结构,由于一叉树是顺序表,三叉树比较复杂,最常用的是二叉树.从这次开始就带领大家走进树的世界. 目录 一.题目 二 ...

  9. 二叉树的顺序存储结构

    一.顺序存储结构 二叉树的顺序存储结构是指用一组地址连续的存储单元依次自上而下.自左至右存储完全二叉树上的结点元素,即将完全二叉树上编号为 i 的结点元素存储在一维数组下标为 i-1 的分量中. 依据 ...

最新文章

  1. 《系统集成项目管理工程师》必背100个知识点-87系统文档验收
  2. excel打印预览在哪里_打印小心机:轮页眉页脚的重要性
  3. 模板:保留小数位后多少位
  4. OpenCV:No value has been specified for property 'manifestOutputDirectory'
  5. 图像局部显著性—点特征(SURF)
  6. 手机技巧:是否应该一次性给手机充电到100%?看完你就明白了!
  7. 冰点文库下载V2绿色版,无需积分自由下载百度,mbalib,豆丁,畅享,hp009,max.book118 文档...
  8. zabbix_server执行window脚本出现中文乱码如何解决
  9. 开放源码的.NET 反编译工具 .NET IL调试工具 学习微软中间语言(MSIL)的绝佳工具 Dotnet IL Editor 推荐...
  10. bnuoj16491
  11. 稀疏矩阵相乘-Python版
  12. 活动报名场地预约自定义表单小程序开发
  13. 计算机培训通知,关于开展上海师范大学2018年计算机办公自动化免费培训的通知...
  14. linux 程序网速监控软件,Linux实时网速监控软件ifstat简易教程
  15. oracle存货转资产,存货转固定资产账务处理
  16. 吉他入门乐理知识精髓篇
  17. java : 实现微信网页授权,超详细!
  18. python数组内运算_Python数组介绍和操作运算详解
  19. 批处理学习整理--批处理清理垃圾与控制开机自启软件实现
  20. python二维数组求和_Python如何对二维数组求和

热门文章

  1. 致远项目管理SPM系统案例:道道全粮油股份有限公司人力资源管理
  2. 视频直播软件未来发展的方向有哪些
  3. tkinter显示图片
  4. 加州大学伯克利分校与KyberNetwork联合进行去中心化交易所研究
  5. 文章标题 SPOJ - DRUIDEOI : Fata7y Ya Warda!(单调栈)
  6. 机房重构一路走来——初步总结
  7. 《疯狂动物城》观影感受
  8. 如何用python画国旗?
  9. PyCharm敲代码光标变黑框
  10. html图片加载不出来