Este documento presenta una introducción a las estructuras de datos no lineales como los árboles. Explica los diferentes tipos de recorridos de árboles como preorden, inorden y postorden. También describe la recursividad y cómo se puede usar en la programación para resolver problemas como el cálculo factorial de manera recursiva. Finalmente, incluye un pseudocódigo para implementar la función factorial de forma recursiva.
1. UNIVERSIDAD DE PANAMA
Facultad de Informática, Electrónica y Comunicación.
INTEGRANTES:
• YESENIA CAMARENA
• GÉNESIS JIMÉNEZ
• MARCOS LUCERO
2. INDICE
Extructuras dinamicas no lineales
Estructuras no lineales
Aplicciones
Recorrido de arboles
Formas de recorrido
Recursividad
Programacion recursiva
Procedimiento de recurso
Pseudocodigo de la función factorial.
3. INTRODUCCION
En el siguiente tema, hablaremos de las estructuras de datos no lineales también llamada
arboles. Estaremos dando una introducción al análisis de la eficiencia de algoritmos.
El estudio de las estructuras de datos se hace desde diversos puntos de vista, diseño de
estructura en respuesta a necesidades especificas, encapsulamiento de los tipos de datos
usándolos en base a su especificación y no a su implementación y estudio de los
principales tipos, tanto elementos y no elementales, dividiendo estos últimos en
estructuras lineales o arboles gráficos.
Analizándolos primero desde el punto de vista teórico sin perder de vista su aplicaciones
graficas.
4. Estructuras Dinámicas No Lineales
Son aquellas que ocupan bloques de memoria no continuos/lineales. Para lidiar con el
problema de la fragmentación y, sobre todo del crecimiento dinámico. Los bloques deben
estar enlazados unos con otros para poder “navegar” por la estructura, es decir, tener
acceso a otro(s) dato(s) a partir de la actual.
5. Estructuras no lineales
Un árbol es una estructura de datos ramificada (no lineal) que puede representarse como
un conjunto de nodos enlazados entre sí por medio de ramas. La información contenida
en un nodo puede ser de cualquier tipo simple o estructura de datos.
6. Aplicaciones
Los árboles tienen una gran variedad de aplicaciones. Por ejemplo, se pueden utilizar para
representar fórmulas matemáticas, para organizar adecuadamente la información, para
construir un árbol genealógico, en la toma de decisiones, para el análisis de circuitos
eléctricos y para numerar los capítulos y secciones de un libro.
Las aplicaciones de los árboles binarios son muy variadas ya que se les puede utilizar para
representar una estructura en la cual es posible tomar decisiones con dos opciones en
distintos puntos.
7. RECORRIDO DE ARBOLES
se refiere al proceso de visitar de una manera sistemática, exactamente una
vez, cada nodo en una estructura de datos de árbol (examinando y/o
actualizando los datos en los nodos). Tales recorridos están clasificados por
el orden en el cual son visitados los nodos. Los siguientes algoritmos son
descritos para un árbol binario , pero también pueden ser generalizados a
otros árboles.
8. FORMAS DE RECORRIDOS
RECORRIDOS EN ÁRBOLES BINARIOS:
en una estructura de datos lineal sólo es posible un tipo de recorrido en dos sentidos
distintos:
Del primero al último o del último al primero
RECORRIDOS DE PROFUNIDAD
Tres tipos de recorridos dependiendo del orden en que se acceda al subárbol izquierdo, al
subárbol derecho o al nodo raíz
En los tres recorridos se accede antes al hijo izquierdo que al hijo derecho.
La variación reside en el momento en que se recorrerá la información del nodo.
Recorrido preorden u orden previo (RID, raíz-hijo izquierdo-hijo derecho).
Recorrido inorden u orden simétrico (IRD, hijo izquierdo-raíz-hijo derecho).
Recorrido postor den u orden posterior (IDR, hijo izquierdo- hijo derecho-raíz).
9. Recorridos en profundidad
Recorrido preorden.
Por cada elemento no vacío:
Se accede primero al nodo raíz.
Se accede al hijo izquierdo en preorden.
Se accede al hijo derecho en preorden.
Recorrido inorden.
Por cada elemento no vacío:
Se accede al hijo izquierdo en inorden.
Se accede primero al nodo raíz.
Se accede al hijo derecho en inorden.
Recorrido postorden.
Por cada elemento no vacío:
Se accede al hijo izquierdo en postorden.
Se accede al hijo derecho en postorden.
Se accede primero al nodo raíz.
10. RECURSIVIDAD
Es un concepto bastante importante y bien básico de la programación. Sin
embargo es bastante difícil de asimilar al principio. Se supone que es algo
que se va entendiendo con práctica y tiempo.
Es una forma mucho más natural que la iteración de expresar un gran
número de funciones y procedimientos.
11. PROGRAMACION RECURSIVA
Es mucho mas difícil desarrollar una solución recursiva en un lenguaje
determinado para resolver un problema especifico cuando no se tiene un
algoritmo. No es solo el programa sino las definiciones originales y los
algoritmos los que deben desarrollarse. En general, cuando encaramos la
tarea de escribir un programa para resolver un problema no hay razón para
buscar una solución recursiva. La mayoría de los problemas pueden
resolverse de una manera directa usando métodos no recursivos. Sin
embargo, otros pueden resolverse de una manera mas lógica y elegante
mediante la recursión.
12. Ejemplo PARA CALCULAR 0,1,2En matemáticas, la sucesión de Fibonacci es la siguiente sucesión infinita de
números naturales: 0,1,1,2,3,5,8,13,21,34,55,89,144...
El primer elemento es 0, el segundo es 1 y cada elemento restante es la suma de los dos anteriores:
0 si i = 0
fi = 1 si i = 1 f(i-2)+f(i-1) si i > 1
A cada elemento de esta sucesión se le llama número de Fibonacci. Esta sucesión fue descrita en
Europa por Leonardo de Pisa, matemático italiano del siglo XIII también conocido como Fibonacci.
El código en C++ que representa la función Fibonacci es el siguiente:
#include <iostream>
#include <cstdlib>
using namespace std;
int Fibonacci(int n);
13. PROGRAMACION RECURSIVA
int main(){
int valor;
system("clear");
cout << "Introduzca numero a calcular: ";
cin >> valor;
cout << "nEl Fibonacci de " << valor << " es: " << Fibonacci(valor) << endl;
return 0;
}
int Fibonacci(int n){ if (n < 0){
cout << “No existe Fibonacci para numeros negativos.”;
} else if (n == 0) {
return 0;
} else if (n == 1) {
return;
}else
return Fibonacci(n-2) + Fibonacci(n -1);
14. PROCEDIMIENTOS RECURSIVO
es aquél que se llama a sí mismo. En general, esta no suele ser la manera
más eficaz de escribir código en Visual Basic. En el siguiente procedimiento
se utiliza la recursividad para calcular el factorial de su argumento original.
15. Se puede utilizar el siguiente método para escribir cualquier rutina recursiva.
Primero obtener una función exacta del problema a resolver.
A continuación, determinar el tamaño del problema completo que hay que resolver, este
tamaño determina los valores de los parámetros en la llamada inicial al procedimiento o
función.
Resolver el caso base en el que el problema puede expresarse no recursivamente, esto
asegura una respuesta afirmativa a la pregunta base.
Por último, resolver el caso general correctamente en términos de un caso más pequeño
del mismo problema, es decir una respuesta afirmativa a las preguntas 2 y 3 del método
de las 3 preguntas.
16. El siguiente ejemplo es sobre el uso de recursividad
A) FUNCIÓN FACTORIAL
El Producto de los enteros positivos, desde 1 hasta N se llama FACTORIAL, y normalmente se denota por N!
Por ejemplo N!=1X2X3... (N-2)(N-1)N
También podemos decir que 0! = 1, esto significa que cero factorial es igual a 1, entonces para todos los
valores enteros no negativos la función está bien definida.
Esto queda como resultado: N!=N(N-1)!
De acuerdo con esto queda entonces de la siguiente forma:
si N=0 entonces N!= 1, quiere decir que si los valores de factorial son 0 o 1 el resultado da 1
si N>0 entonces N!(N-1)!
Se observa que esta definición es recursiva, ya que se llama así misma la función factorial para obtener su
resultado.
El siguiente es el pseudocódigo de la función factorial
17. Pseudocodigo de la función factorial.
FUNCION FACTORIAL(n)
INICIO
Si n= 0 entonces
FACTORIAL =1
Sino
FACTORIAL= n*FACTORIAL (n-1)
FinSi
Fin Funcion
Programa en C# de función factorial