二叉树的顺序结构存储(堆的实现)

本文介绍了堆的概念和结构,强调完全二叉树适合顺序存储。详细阐述了堆的向下调整算法,用于创建小堆,并讨论了堆的插入、弹出操作。此外,还探讨了如何利用堆解决TOP K问题,即在海量数据中找出最大的K个数。
摘要由CSDN通过智能技术生成

先附上之前写的关于树的知识点的回顾
树的概念
二叉树有两种常见的结构方式,一种是顺序存储(就是用数组来存储),一种是链表结构来存储
但是普通的二叉树是不适合用数组来存储,因为可能会存在大量的空间浪费,而完全二叉树是可以用顺序结构来存储的,现实中我们通常把堆(一种二叉树)使用顺序结构数组来存储,需要注意的是这里的堆和我们操作系统虚拟进程地址空间的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域

在这里插入图片描述

堆的概念及结构

如果有一个集合K= {k0,k1,k2,k3,k4,k5,kn-1},把他的所有元素按照完全二叉树的顺序存储方式存储在一个一维数组中,并满足:
K1<=K2i+1且Ki<=K2i+2 (i = 0,1,2,)则成为小堆 ,那么反之如果 K1>= K2i+1且Ki>=K2i+2 就是大堆啦
他的性质:
堆中的某个节点的值总是不大于或不小于其父节点的值(大于还是小于父亲节点,就要看建立的是什么堆了)
堆是一棵完全二叉树

满足这两点就是一个堆

堆的向下调整算法(堆创建的重要一步!)

首先我们要给出一个数组,逻辑上可以看做是一棵完全二叉树,我们通过从根节点开始向下调整,把他调整成小堆,但是向下调整有一个前提:左右子树必须是一个堆才可以调整,如果不是就不能调整!!!

int a[] = {27,15,19,18,28,34,65,49,25,37}

下面我们画出这个完全二叉树,并给出向下调整法

在这里插入图片描述
注意的是我们这个图除了根节点引导的不满足小堆,剩余的两个子树均满足小堆性质,我们这样设置只是为了方便理解,理解之后,我闷才可以将乱序的堆调整成我们想要的堆
向下调整的几个步骤
:
1>找出根节点
2>判断其两个子节点的大小,我们这里调整成小堆,所以找出较小的孩子
3>判断父节点和较小的孩子,如果父节点比那个较小子节点小,那么不用交换,如果大就继续交换
当我们如果发生了交换可能上面满足了性质,但是又导致下面不满足性质,所以需要循环判断
利用 parent = child;可以进行到下一层判断,然后又从1>开始判断,
何时跳出呢,当我们

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值