SoloCodigo
Programación General => Pascal => Mensaje iniciado 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
-
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
-
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.
-
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)
-
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.