Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problemas con Arboles. (https://www.clubdelphi.com/foros/showthread.php?t=29950)

adpa 05-02-2006 15:05:38

Problemas con Arboles.
 
Hola:

Estoy intentando resolver unos problemas de arboles.

1- Función para recorrer un arbol binario por niveles.

2- Función que devuelva la profundidad de un arbol.

3-Function que devuelva los nodos hoja.
Código Delphi [-]
function nodosHoja(A:AB)
BEGIN
     IF a=nil then
        nodosHoja:=0
     ELSE
         IF ( ((A^.hijoIzq = NIL) AND (A^.hijoDer = NIL)) then
              Nodoshoja:=1
         ELSE
              NodosHoja:=nodosHoja(A^.hijoDer)+NodosHoja(A^.hijoIzq);
 
END

4 - Procedimiento que copie un AB
Código Delphi [-]
Procedure copia(A,AC:ab)
begin
     if (a <> nil) then
        begin
            new(ac);
            datos(A^.info,hoja);
            insertar(ac,hoja);
            copia(A^.hijoDer,ac);
            copia(A^.hijoIzq,ac);
        end;
end;

5 - Procedimiento que imprima los nodos del hoja de un nodo binario por niveles, mostrando un rotulo que indique el nivel que se imprimy haciendo un salto de linea cada vez que se cambie de nivel.

6 - Escribir un procedimiento en pascal, que dado un árbol binario de busqueda de enteros, cree una lista enlazada con los nodos del árbol ordenados descendentemente según el valor de enteros almacenados en los nodos.

Si me podeis indicar como tengo que resolver los siguientes problemas.
Gracias.

reina 06-02-2006 16:48:37

Holas! bueno..con respecto a:
*el recorrido del arbol para formar una lista en forma descendente..deberias tener el arbol binario ordenado..los items del arbol deberian haberse insertado
ordenadamente..despues podrias recorrer el arbol INORDEN(descendente) y de cada visita mandas a un proceso insertar lista donde cada nodo que traigas lo vayas poniendo al final de la lista..

Código Delphi [-]
procedure recorrer_inorden(A:arbolBin );
begin
     if A <> nil ) then
     begin  
           recorrer_inorden(A^.der);
           insertarlista(A^.nodo);
           recorrer_inorden(A^.izq);
     end;
end;
..bueno algo asi..ja

*lo de los niveles..seria como un recorrido en amplitud creo.. consiste en encolar (si no están vacíos) los subárboles izquierdo y derecho del nodo extraido de la cola, y seguir desencolando y encolando hasta que la cola esté vacía. Es una idea nomas..es iterativo no recursivo..

Código Delphi [-]
if (A <> nil) begin    
    CrearCola(cola);
    encolar(cola, A);
    while not(colaVacia(cola))begin
         desencolar(cola, aux);
         imprimir(aux);
         if (aux^.izq <> nil) encolar(cola, aux^.izq);
         if (aux^.der <> nil) encolar(cola, aux^.der);
    end;
end;

algo asi tambien..:p
ahi tenes que fijarte como sacar el nro de nivel..pero creo que es facil no?

*Con respecto a la altura del arbol es la cantidad de niveles..que tiene bueno..con lo de arriba deberias darte cuenta..y en si tb lo podrias hacer recursivo..siempre quedandote con el nro..mayor recorriendo hacia la der e izq.

espero que te haya dado una idea..todo esto, de todas maneras las operaciones con arboles binarios no tienen demasiada complicacion..ya que solo tenemos 2 nodos! por nivel..al insertar deberias insertar ordenadamente..el problema de esto es que el arbol por lo gral queda desbalanceado..pero se pueden aplicar tecnicas de balanceo.

saludos!

LA PATRIA SERA LIBRE

adpa 06-02-2006 17:08:01

Muchas Gracias Reina.
Pero tengo alguna duda más.
1 - No tengo muy claro como escribir en el nivel que me encuetro.
2 - Para empezar a mostrar por el último nivel en vez por el primero.
En vez de ir escribiendo lo ira metiendo en una pila y luego voy desapilando y ya está verdad?

3 - Como puedo crear una copia de un arbol.

Muchas Gracias

reina 06-02-2006 21:26:27

Holas again..! te recomiendo te hagas un ejemplito de un arbolito..y sigas el algoritmo para entenderlo..lo de los niveles es facil..tendrias que poner un condición acordate que el nivel tiene 2 nodos izq y derecho ..salvo la raiz!eso que te pase imprime por niveles..ademas es iterativo mucho mas facil de entender..que uno recursivo.
Y con respecto a la copia del arbol..si lo que buscas es hacer otro arbol identico..podes utilizar el recorrido en pre_orden..algo asi:
Código Delphi [-]
   procedure pre_orden(A:arbol);
   begin
        If A <> nil then
        begin        
             insertarAbol_new(A^.dato, B);**el arbol B seria el nuevo
             pre_orden(A^.izq) ;
             pre_orden(A^.der);
   end;

y asi seria..creo jaja..no tengo mucho manejo de puntero

Saludos!

LA PATRIA SERA LIBRE


La franja horaria es GMT +2. Ahora son las 19:22:09.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi