Arvore AVL
int altura(No* pRaiz) { if (pRaiz == NULL) return 0; int hesquerda = altura(pRaiz->esquerda); int hdireita = altura(pRaiz->direita); if(hesquerda > hdireita) { return hesquerda + 1; } else { return hdireita + 1; }
}
No* criarArvore(int elemento, No* esquerda, No* direita) { No* n = (No*) malloc (sizeof(No)); n->elemento = elemento; n->balancear = altura(direita) - altura(esquerda); n->esquerda = esquerda; n->direita = direita; return n;
}
int escreve(No* r) { if (r!= NULL) { escreve(r->esquerda); printf("%d(%d)", r->elemento, r->balancear); escreve(r->direita); }
}
int EsqEsq(No** r) { No* b = *r; No* a = b->esquerda; b->esquerda = a->direita; a->direita = b; a->balancear = 0; b->balancear = 0; *r = a;
}
int DirDir(No** r) { No* a = *r; No* b = a->direita; a->direita = b->esquerda; b->esquerda = a; a->balancear = 0; b->balancear = 0; *r = b;
}
int EsqDir(No** r) { No *c = *r; No *a = c->esquerda; No *b = a->direita; c->esquerda = b->direita; a->direita = b->esquerda; b->esquerda = a; b->direita = c; switch(b->balancear) { case -1: a->balancear = 0; c->balancear = 1; break; case 0: a->balancear = 0; c->balancear = 0; break; case +1: a->balancear = -1; c->balancear = 0; break; } b->balancear = 0; *r = b;
}
int DirEsq(No** r) { No *a = *r; No *c = a->direita; No *b = c->esquerda; c->esquerda = b->direita; a->direita = b->esquerda; b->esquerda = a; b->direita = c; switch(b->balancear) { case -1: a->balancear = 0; c->balancear = 1; break; case 0: a->balancear = 0; c->balancear = 0; break; case +1: a->balancear = -1; c->balancear = 0; break; } b->balancear = 0; *r = b;
}
int aux_inserir(No** pRaiz, int elemento,