二叉堆
二叉堆 二叉堆是一种基础数据结构,二叉堆的操作内容包括插入,删除,查询等。 性质: 堆是一颗完全二叉树,堆的顶端一定是“最大”,最小”的,但是要注意一个点,这里的大和小并不是传统意义下的大和小,它是相对于优先级而言的。 堆有两种模式,小根堆和大根堆,分别对应第二个性质中的“堆顶最大”“堆顶最小”,对于大根堆而言,任何一个非根节点,它的优先级都小于堆顶,对于小根堆而言,任何一个非根节点,它的优先级都大于堆顶。 然而二叉堆的代码实现也有两种,包括手写堆和STL; 首先我们通过手写堆来实现对堆的理解。 1.插入 void swap ( int & x , int & y ) { int t = x ; //交换函数 x = y ; y = t ; } int heap [ N ] ; //定义一个数组来存堆 int siz ; //堆的大小 void push ( int x ) //要插入的数 { heap [ ++ siz ] = x ; now = siz ; //插入到堆底 while ( now ) //还没到根节点,还能交换 { ll nxt = now >> 1 ; //找到它的父亲 if ( heap [ nxt ] > heap [ now ] ) swap ( heap [ nxt ] , heap [ now ] ) ; //父亲比它大,那就交换 else