Como puedo implementar un arbol (tree) en C++?

Iniciado por enriquemesa8080, 2 Noviembre 2019, 19:19 PM

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

enriquemesa8080

Hola, este es una pregunta sobre estructuras de datos. Como puedo implementar un arbol en C++?? Yo lei y es una jerarquia de nodos. Para que tenga mas de un hijo debo implemenarlo con una lista enlazada. Esa idea esta bien para implementar el algoritmo?? No tengo mayores detalles ya que eso fue lo que lei, para ver si puedo lograr construirla. En la estructura quiero almacenar carpetas y archivos, asi sea solo de nombre, la idea es recrear un sistema de archivos interno, para un programa tipo servidor web donde segun se invoque la ruta, ejecuto uno, u otro script.

Es lo que se me ocurre.

struct node{
      struct node *padre;
      vector<node> hijos;
      void *dato; (Sustituir por el dato).
}

Es lo que se me viene a la mente. Y simplemente iterar por cada uno de ellos. Tiene alguna documentacion en español sobre estas estructuras de datos?? Alguna que sea puntual, es decir, que diga directamente que se habla sobre arboles para asi poder abordarla mas sencillo.

Es que esta es una solucion mia y yo he diseñado estructuras como la pila y la lista pero sin saber a ciencia cierta si en verdad trabajan como dichas estructuras descritas por la computacion.

Gracias a todos.

jmpesp

Cita de: enriquemesa8080 en  2 Noviembre 2019, 19:19 PM
Hola, este es una pregunta sobre estructuras de datos. Como puedo implementar un arbol en C++?? Yo lei y es una jerarquia de nodos. Para que tenga mas de un hijo debo implemenarlo con una lista enlazada. Esa idea esta bien para implementar el algoritmo?? No tengo mayores detalles ya que eso fue lo que lei, para ver si puedo lograr construirla. En la estructura quiero almacenar carpetas y archivos, asi sea solo de nombre, la idea es recrear un sistema de archivos interno, para un programa tipo servidor web donde segun se invoque la ruta, ejecuto uno, u otro script.

Es lo que se me ocurre.

struct node{
      struct node *padre;
      vector<node> hijos;
      void *dato; (Sustituir por el dato).
}

Es lo que se me viene a la mente. Y simplemente iterar por cada uno de ellos. Tiene alguna documentacion en español sobre estas estructuras de datos?? Alguna que sea puntual, es decir, que diga directamente que se habla sobre arboles para asi poder abordarla mas sencillo.

Es que esta es una solucion mia y yo he diseñado estructuras como la pila y la lista pero sin saber a ciencia cierta si en verdad trabajan como dichas estructuras descritas por la computacion.

Gracias a todos.

Bueno, para lograr lo que quieres la estructura que mostraste no esta mal.

Lo que no entendi bien fue esto:


En la estructura quiero almacenar carpetas y archivos, asi sea solo de nombre, la idea es recrear un sistema de archivos interno, para un programa tipo servidor web donde segun se invoque la ruta, ejecuto uno, u otro script.


y se me hace que no es muy buena idea.

Podrias brindar mas detalles acerca de que es lo que estas intentando hacer?

K-YreX

Cita de: enriquemesa8080 en  2 Noviembre 2019, 19:19 PM
Para que tenga mas de un hijo debo implemenarlo con una lista enlazada.
struct node{
      struct node *padre;
      vector<node> hijos;
      void *dato; (Sustituir por el dato).
}
Bueno, lo primero es que para que cada nodo tenga más de un hijo no es necesario utilizar una lista enlazada. Los árboles binarios son los más extendidos en programación y cada nodo tiene dos punteros (hijoIzquierda e hijoDerecha) aunque puede tener tres para incluir otro puntero (padre) y poder ascender por el árbol. Depende de lo que tú necesites.
Sería más correcto decir que árboles de n hijos utilizan una lista enlazada y entonces te aviso que la lista enlazada de la STL es <list>, no <vector> aunque es una puntualización pequeña.
Debes estar seguro también de usar correctamente los punteros <void*>.

Quitando esos pequeños detalles, diría que la implementación no está mal.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;