Red de conocimiento informático - Computadora portátil - Biblioteca de funciones de estructura de árbol C

Biblioteca de funciones de estructura de árbol C

Árbol binario: establecido en stl, mapa

Montón: establecido en stl, make_heap, etc.

Árbol normalizado:

//

#include lt;algorithmgt;

usando el espacio de nombres std;

# definir MN (100005)

estructura nodo

{

int l, r

}seg[4*MN];

int n;

int data[26][MN];

//Datos colocados en datos[0][1.

void build(int l, int r, int dex, int nivel)

{

seg[dex].l=l

seg[; dex].r=r;

if(l==r){

datos[nivel] [l]=datos[0][l];

retorno;

}

int mid[0][1 .

int mid = ( l r ) / 2

build(l, mid, dex * 2, nivel 1);

build( mid 1, r, dex * 2 1, nivel 1)

int i = l, j; = mid 1, k = l;

while( i lt; = mid amp; amp; j lt; = r )

{

if(data [nivel 1][i] lt; = datos[nivel 1][j]) //Definición de clasificación

datos[nivel][k] = datos[nivel 1][i]; p>

else//Se puede encontrar el orden inverso cnt =mid-i 1;

data[level][k] = data[level 1][j];

}

while(i lt; = mid)datos[nivel][k] = datos[nivel 1][i]

while(j lt; = r)datos [nivel][k] = datos[nivel 1][j];

}

// consulta(1, c, l, r, 1),

int query(int root, int c, int l, int r, int dep)//(log n)^2

{

int mid= (seg[ raíz].l seg[raíz].r)/2

if(l==seg[raíz].l amp; amp; r==seg[raíz].r)

{

int * p=lower_bound(amp; datos[dep][l], amp; datos[dep][r] 1,

return ( p-amp; data[dep][l]); //devuelve el número de números menores que c en el segmento de intervalo [l, r]

//int *p=uppe

r_bound(amp; datos[dep][l], amp; datos[dep][r] 1, c

//devolver datos[dep][r] 1-p);/ /devuelve el número mayor que c en el segmento de intervalo [l, r]

}

if(rlt;=mid||lgt;=mid 1)return query(root *2 (lgt;=mid 1?1:0),c,l,r,dep 1);

else return query(root*2,c,l,mid,dep 1) query( root*2 1, c, mid 1, r, dep 1);

}

////pku 2104

Árbol sesgado a la izquierda:

p>

//

#include lt;iostreamgt;

usando el espacio de nombres std;

typedef int Elem;

struct Leftnode

{

Elem e;

int dist;

Leftnode *lson, *rson;

Leftnode(Elem ee){dist=0; e=ee; lson=rson=NULL;}

} // El puntero es la raíz del árbol vacío==NULL

Leftnode * Merge(Leftnode *A, Leftnode *B)

{/Después de devolver *A, *B son inútiles pero no están vacíos

if (A==NULL ) devolver B;

si (B==NULL) devolver A;

si (A-gt; egt; B-gt; e)intercambiar (A, B); /montón mínimo

A-gt; rson==NULL||A-gt; rsongt; distlt; A -gt; rson -gt; dist)intercambiar (A-gt; lson, A-gt; rson); ; dist=-1 1; //dis NULL: -1

else A-gt; dist=A-gt; >

}

inserción nula (Elem ee, Leftnode *amp; root)//referencia del puntero de nota

{

Leftnode *tp=new Leftnode (ee);

root=Merge(root, tp);

}

bool delmin(Elem & ee, Leftnode * & root) // Presta atención a las referencias de puntero

{

if(root==NULL)return false;

ee=root-gt;e;

root=Fusionar (root-gt; también

n, root-gt; rson);

devuelve verdadero;

}

//hdu 1512