Algoritmos de Árboles Binarios: Recorridos y Operaciones en C

Enviado por Programa Chuletas y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 4,59 KB

Ejercicio 3: Recorrido Inorden No Recursivo

Implementar una función no recursiva para recorrer un árbol binario en inorden.

void inordenNR(ArbolB T, void (*EscribirElemento)(void *), int tamaño) {
  NodoB nodoActual, aux;
  void *et;
  Pila p;
  int fin;
  int faltaHD; /* Indica si falta el hijo derecho */

  p = CrearPila(sizeof(NodoB));
  et = malloc(tamaño);

  if (!et) {
    /* Error: Sin memoria */
    return;
  }

  aux = NODOB_NULO;
  Push(&aux, p);
  nodoActual = RaizB(T);
  fin = 0;

  while (!fin) {
    while (nodoActual != NODOB_NULO) {
      Push(&nodoActual, p);
      nodoActual = HijoIzqdaB(nodoActual, T);
    }
    Tope(&nodoActual, p);
    Pop(p);
    if (nodoActual != NODOB_NULO) {
      EtiquetaArbolB(et, nodoActual, T);
      (*EscribirElemento)(et);
      nodoActual = HijoDrchaB(nodoActual, T);
    } else {
      fin = 1;
    }
  }
  free(et);
  DestruirPila(p);
}

Ejercicio 2: Reconstrucción de Árboles Binarios

El recorrido en preorden de un determinado árbol binario es: GEAIBMCLDFKJH y en inorden: IABEGLDCFMKHJ.

  • A) Dibujar el árbol binario.
  • B) Dar el recorrido en postorden.
  • C) Diseñar una función para obtener el recorrido en postorden dado el recorrido en preorden e inorden y escribir un programa para comprobar el resultado del apartado anterior.

Respuesta

B) El recorrido en postorden es: IBAEDLFCHJKMG.

C) El código solución al tercer apartado es el siguiente:

/* Fichero: comprobar.c */
char *preorden = "GEAIBMCLDFKJH";
char *inorden = "IABEGLDCFMKHJ";
char *postorden;

void post(char *pre, char *in, char *pos, int n) {
  int longIzqda;
  if (n != 0) {
    pos[n - 1] = pre[0];
    longIzqda = strchr(in, pre[0]) - in;
    post(pre + 1, in, pos, longIzqda);
    post(pre + 1 + longIzqda, in + 1 + longIzqda, pos + longIzqda, n - 1 - longIzqda);
  }
}

Ejercicio 5: Reflexión de un Árbol Binario

Escribir una función que realice la reflexión (espejo) de un árbol binario.

void Refleja(ArbolB T) {
  ArbolB Ti, Td;
  if (T != ARBOLB_VACIO) {
    Ti = PodarHijoIzqdaB(RaizB(T), T);
    Td = PodarHijoDrchaB(RaizB(T), T);
    Refleja(Ti);
    InsertarHijoDrchaB(RaizB(T), Ti, T);
    Refleja(Td);
    InsertarHijoIzqdaB(RaizB(T), Td, T);
  }
}

Ejercicio 6: Conteo de Nodos en un Árbol Binario

Escribir una función recursiva que encuentre el número de nodos de un árbol binario.

int numero(NodoB n, ArbolB T) {
  if (n == NODOB_NULO)
    return 0;
  else
    return 1 + numero(HijoIzqdaB(n, T), T) + numero(HijoDrchaB(n, T), T);
}

Para calcular el número de nodos de un árbol T se haría mediante la llamada: numero(RaizB(T), T).

Ejercicio 7: Altura de un Árbol Binario

Escribir una función recursiva que encuentre la altura de un árbol binario.

#define MAXIMO(a, b) ((a) < (b) ? (b) : (a))

int altura(NodoN n, ArbolB T) {
  if (n == NODOB_NULO)
    return -1;
  else
    return 1 + MAXIMO(altura(HijoIzqdaB(n, T), T), altura(HijoDrchaB(n, T), T));
}

Recorrido en Amplitud (BFS)

Consiste en ir visitando el árbol por niveles. Primero se visitan los nodos de nivel 1 (la raíz), después los nodos de nivel 2, y así sucesivamente hasta que ya no queden más.

Si se realiza el recorrido en amplitud del árbol de ejemplo, se visitarían los nodos en este orden: a, b, c, d, e, f.

En este caso, el recorrido no se realizará de forma recursiva sino iterativa, utilizando una cola como estructura de datos auxiliar. El procedimiento consiste en encolar (si no están vacíos) los subárboles izquierdo y derecho del nodo extraído de la cola, y seguir desencolando y encolando hasta que la cola esté vacía.

En la codificación que viene a continuación no se implementan las operaciones sobre colas.

void amplitud(tarbol *a) {
  tCola cola; /* Las claves de la cola serán de tipo árbol binario */
  arbol *aux;
  if (a != NULL) {
    CrearCola(cola);
    encolar(cola, a);
    while (!colavacia(cola)) {
      desencolar(cola, aux);
      visitar(aux);
      if (aux->izq != NULL) encolar(cola, aux->izq);
      if (aux->der != NULL) encolar(cola, aux->der);
    }
  }
}

Entradas relacionadas:

Etiquetas:
postorden iterativo geaibmcldfkjh y en inorden iabegldcfmkhj Diseñar una función para dar el recorrido en postorden dado el recorrido en preorden e inorden y escribir un programa para comprobar el resultado del apartado anterior funcion inorden, preorden, postorden de un arbol binario pseudocódigo que de cómo salida el postorden dado el recorrido en preorden e inorden. codigo iteracion inorden c++ imprimir arbol binario de char en c recorrido iterativo postorden recorridos arbol binario inorden tamaño 14 pre-orden árbol binario es: geaibmcldfkjh El recorrido en preorden de un determinado árbol binario es: GEAIBMCLDFKJH y en inorden IABEGLDCFMKHJ. arboles recorridos iterativos inorden preorden postorden En el recorrido en preorden de un determinado árbol binario es geaibmcldfkjh y en orden dibujar el árbol binario recorrido por anchura de un árbol binario (por niveles). c++ reflexión de un árbol binario c++ recorridos (pre, in, post, niv) iterativos de un árbol binario busqueda CODIGO C++ ARBOL INORDEN, PREORDEN, POSTORDEN un árbol binario e imprima los recorridos inorden, preorden y postorden del árbol. preorden de geaibmcldfkjh y en inorden iabegldcfmkhj preorden de un arbol geaibmcldfkjh el recorrido en preorden de un determinado arbol binario es: GEAIBMCLDFKJH recorrido preorden determinado árbol binario recorrido postorden iterativo c++ preorden de un determinado árbol binario es: geaibmcldfkjh int longIzqda; if(n!=0){ pos[n-1]=pre[0]; longIzqda=strchr(in,pre[0])-in dibujar un arbol en c++ GEAIBMCLDFKJH preorden GEAIBMCLDFKJH recorrido en amplitud con colas de un arbol binario en "c" codigo completo recorrer arboles binarios por niveles recursivo