Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: _TTFH_3500 en 15 Mayo 2016, 00:16 am



Título: [C/C++] Insertar balanceado en Arbol binario
Publicado por: _TTFH_3500 en 15 Mayo 2016, 00:16 am
Código
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <assert.h>
  5.  
  6. struct nodo_binario {
  7.  int dato;
  8.  nodo_binario* izq;
  9.  nodo_binario* der;
  10. };
  11.  
  12. typedef nodo_binario* BST;
  13.  
  14.  
  15. unsigned int cant_nodos(const BST b) {
  16.  if (b == NULL) return 0;
  17.  else return 1 + cant_nodos(b->izq) + cant_nodos(b->der);
  18. }
  19.  
  20. /**
  21.  * Insetar en orden O(log n) x en b de manera que la cantidad de nodos del
  22.  * subarbol izquierdo (no la altura) sea 1 mayor o igual que la del subarbol derecho.
  23.  */
  24. void Insetar_Balanceado(int x, BST &b) {
  25. /// x siempre mayor que todos los elementos de b.
  26. BST aux = b;
  27. // Buscar nodo mas a la derecha e insertar
  28. while (aux != NULL) {
  29. aux = aux->der;
  30. }
  31. aux = new nodo_binario;
  32. aux->dato = x;
  33. aux->der = aux->izq = NULL;
  34.  
  35. if (cant_nodos(b->der) - cant_nodos(b->izq) == 1) {
  36. // Balancear... ?
  37.  
  38. }
  39. }

¿Como puedo implementar este procedimiento?

Quiero rotar el árbol de manera que la cantidad de nodos del subarbol izquierdo sea 1 mayor o igual que la del subarbol derecho.
Pero no se me ocurre como hacerlo, por ejemplo:

Si el árbol es vació solo inserto y no tengo que hacer nada mas ya que queda balanceado porque la cantidad de nodos del subarbol izquierdo y derecho es igual (vale 0).

Luego si b tiene un elemento, como x es mas grande que los elementos de b al insertar a la derecha por la propiedad de los arboles binarios de búsqueda me queda desbalanceado:
1
  \
   2
ya que el subarbol derecho tiene 1 nodo y es mayor que la cantidad del izquierdo que es 0.

Debería rotar para que quede:
   2
  /
1