elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C/C++] Insertar balanceado en Arbol binario
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C/C++] Insertar balanceado en Arbol binario  (Leído 2,802 veces)
_TTFH_3500

Desconectado Desconectado

Mensajes: 123



Ver Perfil
[C/C++] Insertar balanceado en Arbol binario
« 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


« Última modificación: 15 Mayo 2016, 00:25 am por _TTFH_3500 » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Altura de arbol binario
Java
l337* 4 36,531 Último mensaje 5 Diciembre 2009, 13:08 pm
por imnohacker
Arbol binario Ejemplo
.NET (C#, VB.NET, ASP)
S1dD3xt35 0 7,460 Último mensaje 21 Abril 2010, 07:18 am
por S1dD3xt35
arbol binario
Programación C/C++
karmi 2 4,140 Último mensaje 14 Diciembre 2010, 22:08 pm
por ANTÓN RAMIREZ
exception en arbol binario
Java
m@o_614 1 1,971 Último mensaje 22 Noviembre 2014, 21:46 pm
por DarK_FirefoX
Compilacion - Arbol Binario
.NET (C#, VB.NET, ASP)
Castiel 0 2,164 Último mensaje 18 Febrero 2015, 06:36 am
por Castiel
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines