一、定义
最小-最大堆:是一棵完全二叉树,二叉树的各层交替为最小层和最大层,且根节点位于最小层。
最大层:该层上的节点大于等于以其为根节点的子树上的所有节点。
最小层:该层上的节点小于等于以其为根节点的子树上的所有节点。
二、性质
- 处于最小层节点的关键字值逐层增大,这里是指按树本身节点的联系顺序而非层次遍历的顺序。
- 处于最大层节点的关键字值逐层减小。
- 所有处于最大层节点的关键字值大于所有处于最小层节点的关键字值。
三、最小-最大堆的插入操作
注:堆的层次(深度)编号从1开始,根节点编号也从1开始。
用min_max_insert()函数将数据item插入到堆中,插入前节点个数i=*n;
步骤:
- 最小-最大堆节点个数i=i+1;并求出节点i的父节点parent=i/2;判断父节点parent处于最大层还是最小层。
- 若父节点parent处于最小层:
- 当所插入数据item小于父节点parent的关键字值时,把父节点的关键字值赋给当前节点的关键字值,即heap[i]=heap[parent];然后把数据item插入到以parent节点向上到根节点的最小层中,即调用verify_min(heap,parent,item);
- 若所插入数据item不小于父节点parent的关键字值时,把数据