arboles.c


SUBMITTED BY: albermonte

DATE: Sept. 3, 2017, 11:41 a.m.

FORMAT: C

SIZE: 2.8 kB

HITS: 125701

  1. /*
  2. * arboles.c
  3. *
  4. * Created on: Jan 26, 2017
  5. * Author: Departamento de Automática - UAH
  6. */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include "arboles.h"
  11. /* Añade un nuevo nodo a un árbol binario ordenado. Si el árbol está vacio crea el primer nodo.
  12. * Si el id es mayor que el nodo padre se inserta a la derecha. Si es menor a la izquierda.
  13. * Si es igual no se inserta y se devuelve -1
  14. * Esta función se debe implementar recursivamente.
  15. * [OUT] puntero al nodo padre
  16. * [IN] identificador de un punto
  17. * [IN] distancia del punto del nodo padre al nuevo punto
  18. * [RET] return: devuelve -1 si la operación no se ha podido realizar */
  19. int aniadirNodo(Nodo_t** nodo, char id, float distancia)
  20. {
  21. if((*nodo)==NULL)
  22. {
  23. (*nodo)=(Nodo_t *)malloc(sizeof(Nodo_t));
  24. if((*nodo)==NULL)
  25. {
  26. printf("Falta memoria");
  27. return -1;
  28. }
  29. else
  30. {
  31. (*nodo)->punto.id=id;
  32. (*nodo)->punto.distancia=distancia;
  33. (*nodo)->hijoIzq=(*nodo)->hijoDer=NULL;
  34. return 1;
  35. }
  36. }
  37. else
  38. {
  39. if((*nodo)->punto.id>id) //Izq
  40. {
  41. return aniadirNodo(&((*nodo)->hijoIzq),id,distancia);
  42. }
  43. else if((*nodo)->punto.id<id) //Der
  44. {
  45. return aniadirNodo(&((*nodo)->hijoDer),id,distancia);
  46. }
  47. else
  48. {
  49. return -1;
  50. }
  51. }
  52. return 1;
  53. }
  54. /* Elimina un nodo del arbol y todo lo que cuelga de él. Esta función es recursiva
  55. * [OUT] nodo raiz de árbol
  56. * [IN] identificador del punto a eliminar
  57. * [RET] return: devuelve -1 si la operación no se ha podido realizar */
  58. int eliminarNodo(Nodo_t** nodo, char id)
  59. {
  60. if(*nodo==NULL)
  61. {
  62. return -1;
  63. }
  64. else if(id>(*nodo)->punto.id)
  65. {
  66. return eliminarNodo(&((*nodo)->hijoDer), id);
  67. }
  68. else if (id<(*nodo)->punto.id)
  69. {
  70. return eliminarNodo(&((*nodo)->hijoIzq), id);
  71. }
  72. else
  73. {
  74. free(*nodo);
  75. return 0;
  76. }
  77. }
  78. /* Cuenta el número de nodos del arbol. Esta función es recursiva
  79. * [IN] nodo raiz de árbol
  80. * [RET] return: devuelve el número de nodos */
  81. int contarNodos(const Nodo_t* nodo)
  82. {
  83. int nIzq=0, nDer=0;
  84. if(nodo==NULL)
  85. {
  86. return 0;
  87. }
  88. if((nodo->hijoIzq)!=NULL || (nodo->hijoDer)!=NULL)
  89. {
  90. nIzq += contarNodos(nodo->hijoIzq);
  91. nDer += contarNodos(nodo->hijoDer);
  92. }
  93. else
  94. {
  95. return 1;
  96. }
  97. return nIzq+nDer+1; // +1 porque el primer nodo no se cuenta
  98. }
  99. /* Libera la memoria del árbol. Va liberando la memoria de las hojas a la raiz.
  100. * Esta función es recursiva
  101. * [OUT] puntero a la raiz del árbol
  102. * [RET] return: devuelve -1 si la operación no se ha podido realizar */
  103. int borrarArbol(Nodo_t** nodo)
  104. {
  105. if((*nodo)!=NULL)
  106. {
  107. borrarArbol(&((*nodo)->hijoIzq));
  108. borrarArbol(&((*nodo)->hijoDer));
  109. free((*nodo));
  110. }
  111. *nodo = NULL;
  112. return 0;
  113. }

comments powered by Disqus