Código
#include <conio.h> #include <stdio.h> #include <stdlib.h> #include <ctype.h> typedef struct node { int num, bal; struct node *izq, *der; }node; typedef node *ptr; void rota_izq(ptr *pp) { ptr p=*pp, r; *pp=r=p->der; p->der=r->izq; r->izq=p; p->bal--; if(r->bal > 0) p->bal -= r->bal; r->bal--; if(p->bal < 0) r->bal += p->bal; } void rota_der(ptr * pp) { ptr p=*pp, l; *pp = l = p->izq; p->izq = l->der; l->der = p; p->bal++; if(l->bal < 0) p->bal -= l->bal; l->bal++; if(p->bal > 0) l->bal += p->bal; } int insert(ptr *pp, int x) { int deltaH=0; ptr p=*pp; if(p == NULL) { if(p==NULL) p->num = x; p->bal=0; p->izq = p->der = NULL; deltaH = 1; } else if(x > p->num) { if(insert(&p->der, x)) { p->bal++; if(p->bal == 1) deltaH=1; else if(p->bal ==2) { if(p->der->bal == -1) rota_der(&p->der); rota_izq(pp); } } } else if(x < p->num) { if(insert(&p->izq, x)) { p->bal--; if(p->bal == -1) deltaH= 1; else if(p->bal == -2) { if(p->izq->bal == 1) rota_izq(&p->izq); rota_der(pp); } } } return deltaH; } int delnode(ptr *pp, int x) { ptr p=*pp, *qq; int deltaH = 0; if(p==NULL) return 0; if(x < p->num) { if(delnode(&p->izq, x)) { p->bal++; if(p->bal == 0) deltaH=1; else if(p->bal==2) { if(p->der->bal == -1) rota_der(&p->der); rota_izq(pp); if(p->bal == 0) deltaH=1; } } } else if(x>p->num) { if(delnode(&p->der, x)) { p->bal--; if(p->bal ==0) deltaH=1; else if(p->bal == -2) { if(p->izq->bal ==1) rota_izq(&p->izq); rota_der(pp); if(p->bal == 0) deltaH = 1; } } } else { if(p->der == NULL) { *pp = p->izq; return 1; } else if(p->izq == NULL) { *pp = p->der; return 1; } else { qq = &p->izq; while((*qq)->der != NULL) qq = &(*qq)->der; p->num=(*qq)->num; (*qq)->num=x; if(delnode(&p->izq, x)) { p->bal++; if(p->bal == 0) deltaH = 1; else if(p->bal ==2) { if(p->der->bal == -1) rota_der(&p->der); rota_izq(pp); deltaH=1; } } } } return deltaH; } void printtree(node *p, int pos) { if(p != NULL) { printtree(p->der, pos+6); printtree(p->izq, pos+6); } } main() { int x; char ch; node *root = NULL; clrscr(); "su raiz en la izq. Girela 90 grados\n" "en el sentido del reloj para obtener su representacion usual\n"); for(;;) { "o por D para borrar, o Q para salir: "); break; if(ch == 'I') insert(&root, x); else if(ch == 'D') delnode(&root, x); printtree(root, 6); } return 0; }