c++优先队列(priority_queue)2022年10月26日Poty Q

因此,若是不把最后一个元素拿出来,最后极可能会致使彻底二叉树叶子节节点不是按顺序排列。 最后出队+维护操做的时间复杂度也是O(1)+Ο(logn)。

有些人可能会有疑问,说出队直接把最顶端节点出队,而后直接维护调整顺序不就好了?为何还要把最后一个元素也取出来?

它的父节点在 2/i 位置上。其左儿子在2i位置上,对于堆中的任意一个位置i上的元素,二叉树:最小元素在根结点上,任意子树也是一个堆。右儿子在2i+1位置上,

出队必定是出数组的第一个元素(最小元素),这么来第一个元素的位置就成了空位,咱们须要调整元素,从空位的两个子节点中选出一个最小的向上移动,此时原来的那个子节点变成了父节点,而它原来的位置空了出来,这是就变成了二叉堆的子堆移动的问题,因此这样递归一层一层移动,直到空出来的位置被移动的叶子节点。而后把数组最后一个元素插入这个空位。

答案是:为了保证维护后仍是一个彻底二叉树,根据彻底二叉树的性质,若是这个彻底二叉树不是满二叉树,可是节点的顺序必定要保证是 i 2*i 2*i+1

c++优先队列(priority_queue)2022年10月26日Poty Q

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

滚动到顶部