1:介绍之前先理解树的存储方式,参考图中的0-14的树结构,图片左下角,libevent使用的是顺序存储结构,一句话描述就是完全二叉树的顺序存储,仅需从根节点开始,按照层次依次将树中节点存储到数组即可
2:插入:图中列举了依次插入9,8,7,6,5,4的情况,与实验结果相符合
3:解释下代码中有段不太好理解的代码:
min_child -= min_child == s->n || min_heap_elem_greater(s->p[min_child], s->p[min_child - 1]);
这句换是为了取出子节点中较小的节点
运算优先级是:
min_child == s->n
min_heap_elem_greater(s->p[min_child], s->p[min_child - 1]);
min_child -= (这里只有1或者0的情况,取决于上面的运算结果)
case:如果右节点已经是最后一个节点,那无需进行比较,直接取左节点,也就是-1
case:如果右节点大于左节点,那么min_child -=1,不然就取右节点
4:这不是二叉排序树,排序树中右节点大于根节点,左节点小于根节点,而libevent中的树的父节点永远小于子节点,2个子节点之间并没有固定大小之分,实现的是最小堆数据结构,因为只关心超时时间最小的时间
最大堆和最小堆是二叉堆的两种形式。
最大堆:根结点的键值是所有堆结点键值中最大者,且每个结点的值都比其孩子的值大
最小堆:根结点的键值是所有堆结点键值中最小者,且每个结点的值都比其孩子的值小