Formula o algoritmo???

Iniciado por TomaSs, 29 Mayo 2012, 18:55 PM

0 Miembros y 1 Visitante están viendo este tema.

TomaSs

#10
Pues la distribución siempre va a ser la misma, no se que más quieres que te explique jeje
Es decir, siempre va a seguir este esquema: http://oi47.tinypic.com/2dwcnes.jpg
teniendo en cuenta que siempre los nodos de la columna 0 van a ser potencias de 2, es decir, 2, 4, 8, 16, etc, pero el recorrido del arbol siempre se hará como en esta última foto

$Edu$

Bueno veo a ver si puedo, sino alguien lo hara

79137913

HOLA!!!

Mañana posteo.

GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

TomaSs

#13
Bueno pues aquí va algo que he pensado, eso si, muy enrevesado... xddd
Es a nivel de programación, ya que algo a nivel matemático no he sido capaz de sacar.

• Tenemos el número total de filas: numFilas

• Dividimos dicho número de filas entre 2 para sacar el número de nodos de la columna 0:
   nodosCol0 = numFilas/2

• Calculamos el logaritmo en base 2 de nodosCol0 para sacar el número de columnas:
   numCol = log(nodosCol0)/log(2)

• Creamos una matríz [numCol X nodosCol0] que albergue por cada columna, los números de nodo que le pertenecen:
   Recorremos el arbol de la manera que hay que recorrerlo, desde el nodo 0--> http://oi47.tinypic.com/2dwcnes.jpg
   Puesto que para cada nodo conocemos su columna almacenamos cada uno en su registro de la matríz correspondiente, quedando la matríz de esta manera una vez recorrido todo el arbol:
   
   Col0-->0, 4, 5, 7, 8, 11, 12, 14
   Col1-->1, 6, 9, 13
   Col2-->2, 10
   Col3-->3


• Recorremos la matríz para sacar las filas de los nodos que contiene (suponiendo que la matríz comienza en 0):
   Obtenemos un multiplicador (multi) que, multiplicado por la posición de los nodos en la matríz, nos devolverá la fila que ocupa dicho nodo. De esta manera iremos almacenando las filas de cada nodo en un array, el cual contendrá todos los nodos ordenados por filas y no según el orden indicado inicialmente.

   for(p=0; p<=numCol; p++){

      multi = 2^(p+1);

      for(j=0; j<nodosCol0; j++){

         fila = j * multi + sumatorio(p);
         array[fila] = matriz[p][j];

      }
   }

• El array que obtendremos para el caso del árbol grande que he puesto en la foto sería el siguiente, es decir el orden "por filas" de los nodos:
   [0, 1, 4, 2, 5, 6, 7, 3, 8, 9, 11, 10, 12, 13, 14]

TomaSs

¿Como lo veis? a ver si alguien podría aportar algo más matemático, en caso de que fuera posible ;)

79137913

HOLA!!!

Hola, por metodos matematicos no pude resolver el problema (lamentable)...

Pero hice un codigo para que diseñe el arbol por si a alguien le sirve.

Código (vb) [Seleccionar]
VERSION 5.00
Begin VB.Form Form1
   Caption         =   "Form1"
   ClientHeight    =   3195
   ClientLeft      =   60
   ClientTop       =   345
   ClientWidth     =   4680
   LinkTopic       =   "Form1"
   ScaleHeight     =   3195
   ScaleWidth      =   4680
   StartUpPosition =   3  'Windows Default
   Begin VB.TextBox Text1
      Height          =   3090
      Left            =   150
      MultiLine       =   -1  'True
      TabIndex        =   0
      Top             =   75
      Width           =   2715
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Sub Form_Load()
On Error GoTo ERR
Show
Dim n As Long
Dim m As Long
Dim suma As Long
Dim grado As Long
Dim Matriz() As Long
Dim FLAG As Boolean
Dim CERO As Long
    n = InputBox("numero de filas//nodos (empezando de 0)")
    m = InputBox("que numero de nodo busca?")
    For X = 1 To n
        suma = suma + 2 ^ X
        If suma = n Then grado = X
    Next
    ReDim Matriz(n, grado)
    For Y = 0 To grado
        CERO = -1
        For X = 0 To n
            FLAG = False
            For Z = 0 To Y - 1
                If Matriz(X, Z) = 1 Then FLAG = True
            Next
            If FLAG = False Then CERO = X: Exit For
        Next
        For X = CERO To n Step 2 ^ (1 + Y)
            Matriz(X, Y) = 1
        Next
    Next
ERR:
    For X = 0 To n
        For Y = 0 To grado
            ASD = ASD & Matriz(X, Y)
        Next
        Text1.Text = Text1.Text & vbNewLine & ASD
        ASD = ""
    Next   
End Sub


GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

TomaSs

pero por lo que puedo ver, ahí no usas para nada el número de nodo que busca, el m, es porque al final solo hiciste que diseñara el arbol en vez de buscar su fila, no?

de todos modos, no es mal trabajo, aunque me cuesta un poco verlo con tanto bucle anidado haha

79137913

HOLA!!!

Mi idea era diseñar el arbol y luego recorrer la matriz de alguna manera y numerar los nodos, luego simplemente buscar el nodo nro sin requerir la columna.

Aunque con la manera que hago los nodos te puedo decir las filas de los nodos correspondientes a una columna.

GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

$Edu$

Capas que hay alguna formula para hallarlos, seguramente si, pero si sos vos el que haces esa matriz, es facil recorrerla para saber cual es la fila, asi como dijo 79137913.

Es decir, si tenes una matriz [n][m], lo que haces es recorrer cada elemento hasta encontrar el nodo y ahi mostrar el valor de m y sera la fila. No vale la pena pensar una formula si lo podes hacer asi de facil.

AgnesBlack

tarde respondo el mensaje y si hay un metodo es usando el metodo el Binary tree sort  o el de busqueda con puntero te dejo un ejemplo de uno que hice principio de año
este es con busqueda de puntero que es lo mas eficiente y rapido para buscar dicho nodo que buscas

unit uabb2;



{arbol binario de busqueda con punteros}



interface

type



  tipoClave=integer;

  tipoElemento=record

      clave:tipoClave;

  end;



  tipoPuntero=^tipoNodoArbol;

  tipoNodoArbol=record

      elemento:tipoElemento;

      izquierdo:tipoPuntero;

      derecho:tipoPuntero;

  end;



  tipoArbol=tipoPuntero;





var

  raizArbol:tipoArbol;



  procedure buscar(nodoArbol:tipoArbol; valorClave:tipoClave; var infoElemento:tipoElemento; var estaEnArbol:boolean);

  procedure insertar(var nodoArbol:tipoArbol; infoElemento:tipoElemento);

  procedure suprimir(var nodoArbol:tipoArbol; valorClave:TipoClave);

  procedure inOrden(nodoArbol:tipoArbol);

  procedure preOrden(nodoArbol:tipoArbol);

  procedure crearArbol(var nodoArbol:tipoArbol);

  function arbolVacio(nodoArbol:tipoArbol):boolean;



implementation



  procedure crearArbol(var nodoArbol:tipoArbol);

  begin

      raizArbol:=nil;

  end;





  procedure imprime(nodoArbol:tipoElemento);

  begin

       writeln('elemento ', nodoArbol.clave);

  end;





  function arbolVacio(nodoArbol:tipoArbol):boolean;

  begin

  if nodoArbol=nil then arbolVacio:=true

  else

      arbolVacio:=false;

  end;





  procedure preOrden(nodoArbol:tipoArbol);

  begin

      if not ArbolVacio(nodoArbol) then begin

         imprime(nodoArbol^.elemento);

         preOrden(nodoArbol^.izquierdo);

         preOrden(nodoArbol^.derecho);

      end

  end;

 



  procedure inOrden(nodoArbol:tipoArbol);

  begin

      if not ArbolVacio(nodoArbol) then begin

         inOrden(nodoArbol^.izquierdo);

         imprime(nodoArbol^.elemento);

         inOrden(nodoArbol^.derecho);

      end

  end;







  procedure buscar(nodoArbol:tipoArbol; valorClave:tipoClave; var infoElemento:tipoElemento; var estaEnArbol:boolean);

  var

     temp:tipoArbol;

  begin

       temp:=raizArbol;

       estaEnArbol:=false;



       while ((not ArbolVacio(temp)) and (not estaEnArbol)) do

           if temp^.elemento.clave=valorClave then

              estaEnArbol:=true

           else

               if temp^.elemento.clave>valorClave then

                   temp:=temp^.izquierdo

               else

                   temp:=temp^.derecho;



       if estaEnArbol then infoElemento:=temp^.elemento

  end;

 



  procedure insertar(var nodoArbol:tipoArbol; infoElemento:tipoElemento);

  var

     nuevoNodo:tipoArbol;

     temp,anterior:tipoArbol;

     claveNueva:tipoClave;

  begin

       new(nuevoNodo);

       nuevoNodo^.izquierdo:=nil;

       nuevoNodo^.derecho:=nil;

       nuevoNodo^.elemento:=infoElemento;



       claveNueva:=infoElemento.clave;



       temp:=nodoArbol;

       anterior:=nil;



       while not ArbolVacio(temp) do begin

           anterior:=temp;

           if temp^.elemento.clave>claveNueva then

              temp:=temp^.izquierdo

           else

              temp:=temp^.derecho

       end;



       if ArbolVacio(anterior) then {vacio}

           nodoArbol:=nuevoNodo

       else

           if anterior^.elemento.clave>claveNueva then

              anterior^.izquierdo:=nuevoNodo  {nuevo nodo a izq del padre}

           else

              anterior^.derecho:=nuevoNodo

  end;





  procedure suprimirNodo(var nodoArbol:tipoArbol; temp,anterior:tipoArbol);

  var

     auxiliar:tipoArbol;

  begin

      if (temp^.derecho=nil) and (temp^.izquierdo=nil) then

         if anterior=nil then

            nodoArbol:=nil {xq el arbol solo tenia un nodo!}

         else

            if anterior^.derecho=temp then  {eliminando una hoja}

                anterior^.derecho:=nil

            else

                anterior^.izquierdo:=nil



      else

          if (temp^.derecho<>nil) and (temp^.izquierdo<>nil) then begin

               anterior:=temp;

               auxiliar:=temp^.izquierdo;



               while auxiliar^.derecho<>nil do begin

                   anterior:=auxiliar;

                   auxiliar:=auxiliar^.derecho;

               end;



               temp^.elemento:=auxiliar^.elemento;

               if anterior=temp then

                   anterior^.izquierdo:=auxiliar^.izquierdo

               else

                   anterior^.derecho:=auxiliar^.izquierdo;



               temp:=auxiliar



          end

          else begin

               {el nodo tiene un hijo. debe subir}

               if temp^.derecho<>nil then {hijo derecho}

                  if anterior=nil then

                    anterior^.derecho:=temp^.derecho

                  else

                      if anterior^.derecho=temp then

                         anterior^.derecho:=temp^.derecho

                      else

                         anterior^.izquierdo:=temp^.derecho



               else {hijo izquierdo}

                    if anterior=nil then

                       anterior^.izquierdo:=temp^.izquierdo

                    else

                       if anterior^.derecho=temp then

                           anterior^.derecho:=temp^.izquierdo

                       else

                           anterior^.izquierdo:=temp^.izquierdo;

          end;





       dispose(temp);

  end;



  procedure suprimir(var nodoArbol:tipoArbol; valorClave:TipoClave);

  var

    temp, anterior:tipoArbol;

  begin

       temp:=nodoArbol;

       anterior:=nil;



       while temp^.elemento.clave<>valorClave do begin

           anterior:=temp;

           if temp^.elemento.clave>valorClave then

              temp:=temp^.izquierdo

           else

              temp:=temp^.derecho

       end;



       suprimirNodo(raizArbol,temp, anterior)

  end;







end.


ah traves de esto podes modificarlo para buscar el nodo que quieras y eliminarlo