由于堆是⼀个完全⼆叉树,因此可以⽤⼀个数组来存储。(如果不清楚大家可以回顾⼆叉树的存储(上)c++文章里的顺序存储)
结点下标为 i :
- 如果⽗存在,⽗下标为 i/2 ;
- 如果左孩⼦存在,左孩⼦下标为 i × 2 ;
- 如果右孩⼦存在,右孩⼦下标为 i × 2 + 1 。
存储固然简单,但是题⽬不会那么好⼼,直接给出⼀个标准的堆。⼀般给我们的是⼀组数,这组数按照给出的顺序还原成⼆叉树之后,并不是⼀个堆结构。此时如果想将这组数变成堆的话,有两种操作:
- ⽤数组存下来这组数,然后把数组调整成⼀个堆;
- 创建⼀个堆,然后将这组数依次插⼊到堆中