SoloCodigo

Programación General => Pascal => Mensaje iniciado por: rcarvajales en Miércoles 17 de Mayo de 2006, 11:43

Título: Funcion Padre
Publicado por: rcarvajales en Miércoles 17 de Mayo de 2006, 11:43
Pues eso, a ver si hay algun crack por aqui que me diga como hacer una funcion q pasandole un arbol y un nodo nos devuelva a su padre

Saludos y Gracias
Título: Re: Funcion Padre
Publicado por: akai-chan en Miércoles 17 de Mayo de 2006, 16:47
Este procedimiento es para un ABC (arbol binario de busqueda) en el cual tiene los nodos ordenados. No se si es el que quieres pero a mano solo tngo este.
Si tu arbol no es ordenado tambien tengo el codigo pero ahora mismo no aqui.

A=arbol
n=nodo del q queremos sabel el padre
cap= primer nodo del arbol

Procedimiento Padre(var A : t_arbol, n : t_pos, cap: t_pos)
var c, a : t_pos;
var flag: boolean
Begin
if (n <> cap) then
   Begin
c=cap
flag=0
While (c<>NULL and flag=0) then
   Begin
If (c->valor=n)then
   Begin
   flag=1
   End
Else
   Begin
   If (c->valor=n) then
      a=c
      c=c->segdcha 'pasa al nodo hijo derecho
   Else
      a=c
      c=c->segizda 'pasa al nodo hijo izquierdo
   End
End

If (flag=1)
   Begin
   Mostrar (a->valor.id)
   End
Else  Mostrar (“el producto introducido no existe”)
   End
   End

         
hace muxo tiempo q lo ice...no se si lo entenderas
Título: Re: Funcion Padre
Publicado por: Danielo en Miércoles 17 de Mayo de 2006, 22:26
podrías apuntar cada nodo del árbol a su correspondiente nodo padre, claro que esto habría que hacerlo en la constructora que agrega un nuevo nodo (habría que ver como está definido el árbol y si es posible y vale la pena hacer algo así).
De esta forma para saber quien es el padre de un nodo cualquiera del árbol bastaría con retornar el puntero de ese nodo a su padre.
Título: Re: Funcion Padre
Publicado por: rcarvajales en Jueves 18 de Mayo de 2006, 13:51
Mirar, yo he creado una funcion  "esHijo(a:tipoArbol; nif:tipoNif):boolean;"
me devuelve true or false dependiendo si el nif es hijo directo del nodo que le he pasado

La funcion padre se encarga de ir corriendo el puntero de forma recursiva y voy haciendo sucesivas llamadas a la funcion esHijo hasta q salte, mi problema es que cuando salta, aun tiene pendientes varias llamadas recursivas, por lo que vuelve a llamar a la funcion es hijo con otros valores y claro, devuelve false y todo a tomar por culo. No se como hacerlo os adjunto el codigo por siaca veis algo raro:

(http://img106.imageshack.us/img106/9136/padre3rx.th.jpg) (http://img106.imageshack.us/my.php?image=padre3rx.jpg)

(http://img128.imageshack.us/img128/1903/eshijo9cn.th.jpg) (http://img128.imageshack.us/my.php?image=eshijo9cn.jpg)
Título: Re: Funcion Padre
Publicado por: rebosador en Miércoles 24 de Mayo de 2006, 18:32
hola, te mando la funcion es hijo modificada ya que la funcion es padre en principio la tienes bien aunq no se si e cambiado algo, miratela tb x si acaso, ok?

function eshijo (a:tipoarbolgen; nifcliente:tiponif; var encontrado:boolean):boolean;
  var
    aux:tipoarbolgen;
  begin
    eshijo:=false;
    aux:=a^.hijo;
    encontrado:=false;
    while (aux<>nil) and (not encontrado) do
      begin
        encontrado:=aux^.cliente.nif=nifcliente;   //compruebo si los nifs son iguales
        aux:=aux^.siguiente;
      end;
    eshijo:=encontrado;
  end;


y x si acaso la unidad padre:

function padre(a:tipoArbolGen; nifCliente:string):tipoArbolGen;
  var
    aux:tipoarbolgen;
    enc:boolean;
  begin
    aux:=a;
    padre:=nil;
    if eshijo (aux,nifcliente,enc) then
      padre:=aux
    else
      begin
        if not enc and (aux^.hijo<>nil) then
          padre:=padre (aux^.hijo,nifcliente);
        if not enc and (aux^.siguiente<>nil) then
          padre:=padre (aux^.siguiente,nifcliente);
      end;
  end;


gracias a ti tb xq me as dado ideas de como acer estas funciones q yo tb estaba un poco perdido... de todas formas el problema q tenias es q la funcion padre es recursiva xo la hijo no puede serlo nunk xq simplemente buscas entre todos sus hijos y ya esta...un saludo y espero q te haya servido de algo.