Recorriendo árboles

Recorriendo árboles

Ayer un amigo me preguntaba por como recorrer un ├írbol en orden, particularmente cuando puedes hacer movimientos de hojas completas, y le mand├® este ejemplo

create table arbol (ID INT IDENTITY NOT NULL primary key,
NAME NVARCHAR(50) NOT NULl,
PARENT_ID INT NULL
);

Creada la tabla le insertamos algunos valores a modo de ejemplo

insert into arbol values ('nodo padre',null),('nodo hijo A',1),('nodo hijo B',1),('nodo hijo A-A',2),('nodo hijo A-B',2),('nodo hijo A-C',2);

Y ahora la funci├│n Recursiva que lo recorre. La primera de las partes indica la condici├│n de entrada (where parent_id is null), tras el union all hacemos referencia a nosotros mismos entrando en modo recursivo, hasta que se acaben los elementos, es decir hasta llegar a las hojas.
El único truco está que que añadimos la ruta que vamos recorrriendo, concatenando el identificador en cada uno de esos pasos recursivos

with ObtenerArbol(ID,NAME,PARENT_ID, ruta)   as
(select folders.ID,folders.NAME,folders.PARENT_ID, cast(cast(id as varchar)+ '->' as varchar(5000)) ruta  From arbol folders 
 where PARENT_ID is null   
 union ALL 
   select f.ID,f.NAME,f.PARENT_ID,  cast(ruta + cast(f.id as varchar) + '->' as varchar(5000)) from arbol f   
 inner join ObtenerArbol mc on f.PARENT_ID=mc.ID )
 select * from ObtenerArbol ORDER BY ruta

Ahora movemos un nodo de posici├│n

update arbol set PARENT_ID=3 where id=2

Y volvemos a sacar el árbol

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *