xiaoxiao2022-07-07  158

    堆结构是一种数组对象,它可以被视为一棵完全二叉树。树中每个结点与数组中存放该结点中值的那个元素相对应。 设数组A的长度为len,二叉树的结点个数为size,size≤len,则A[i]存储二叉树中编号为i的结点值(1≤i≤size),而A[size]以后的元素并不属于相应的堆,树的根为A[1],并且利用完全二叉树的性质,我们很容易求第i个结点的父结点(parent(i))、左孩子结点(left(i))、右孩子结点(right(i))的下标了,分别为:i/2、2i、2i+1; 堆具有这样一个性质,对除根以外的每个结点i,A[parent(i)]≥A[i]。这种堆又称为“大根堆”;反之,对除根以外的每个结点i,A[parent(i)]≤A[i]的堆,称为“小根堆”。 加入并删除一个元素 void put(int d) //heap[1]为堆顶

    { int now, next; heap[++heap_size] = d; now = heap_size; while(now > 1) { next = now >> 1; if(heap[now] >= heap[next]) break; swap(heap[now], heap[next]); now = next; } }

    最新回复(0)