数据结构--二叉堆
二叉堆是完全二元树或者是近似完全二元树,按照数据的排列方式可以分为两种:最大堆和最小堆。 最大堆:父结点的键值总是大于或等于任何一个子节点的键值;最小堆:父结点的键值总是小于或等于任何一个子节点的键值。示意图如下: 二叉堆一般都通过"数组"来实现。数组实现的二叉堆,父节点和子节点的位置存在一定的关系。有时候,我们将"二叉堆的第一个元素"放在数组索引0的位置,有时候放在1的位置。当然,它们的本质一样(都是二叉堆),只是实现上稍微有一丁点区别。 假设"第一个元素"在数组中的索引为 0 的话,则父节点和子节点的位置关系如下: (01) 索引为i的左孩子的索引是 (2*i+1); (02) 索引为i的右孩子的索引是 (2*i+2); (03) 索引为i的父结点的索引是 floor((i-1)/2); 假设"第一个元素"在数组中的索引为 1 的话,则父节点和子节点的位置关系如下: (01) 索引为i的左孩子的索引是 (2*i); (02) 索引为i的右孩子的索引是 (2*i+1); (03) 索引为i的父结点的索引是 floor(i/2); 二、二叉堆的操作 堆一般使用数组来构建,假设为数组a[],结点通常存储在a[1],这样对于下标为k的结点a[k]来说,其左孩子的下标为2*k,右孩子的下标为2*k+1。 1、插入结点到堆中. 由于小根堆是由数组实现的完全二叉树