¿Cómo implemento un árbol N-ary en C?

Si N es una constante de tiempo de compilación, puede simplemente #define o const int , junto con una estructura como

  const int N = 4;

 typedef struct node {
	 int val;
	 struct * node children [N];
 } nodo;
 raíz del nodo = {0};  // inicializa todo a 0

 nodo * nuevo_nodo (int val) {
	 nodo * x = calloc (sizeof (nodo), 1);  // malloc + memset (0)
	 x-> val = val;
	 volver x;
 }

 func nulo () {
	 nodo * n = nuevo_nodo (5);
	 n-> hijos [0] = nuevo_nodo (10);
	 //n->children[1..3] son ​​NULL

	 gratis (n-> niños [0]);
	 libre (n);
 }

Si N es un valor dinámico de tiempo de ejecución, debe saber con certeza cuál será su valor antes de asignar cualquier nodo en el árbol. Es posible tener un valor diferente de N para cada nodo. Si desea aumentar el valor de N para todos los nodos en un árbol existente, probablemente sea mejor copiar todos los datos en un árbol nuevo con más almacenamiento. Un esquema de asignación simple se vería así:

  typedef struct node {
	 int val;
	 estructura * nodo [0];
 } nodo;

 raíz del nodo = {0};  // válido, pero tiene N = 0

 //forma apropiada
 nodo * nuevo_nodo (int n, int val) {
	 nodo * x = calloc (sizeof (nodo) + n * sizeof (nodo *), 1);
	 x-> val = val;
	 volver x;
 }

 func nulo () {
	 nodo * n = nuevo_nodo (5, 3);
	 n-> hijos [0] = nuevo_nodo (10, 3);
	 // n-> hijos [1] es NULL
	 n-> hijos [2] = nuevo_nodo (15, 3);

	 gratis (n-> niños [0]);
	 libre (n);
 }

Esto se puede usar de la misma manera que la versión N constante de tiempo de compilación. Se basa en una peculiaridad de matrices dentro de estructuras que técnicamente cuenta como desbordamiento de búfer. Algunos analizadores estáticos o depuradores de tiempo de ejecución en profundidad, como valgrind, pueden causarle cierta pena, incluso si es válido.

Si sus datos son estáticos, podría ser mejor contar el almacenamiento requerido y asignar un único búfer para todos los nodos. Incluso podría tener el menor valor posible de N para cada nodo, pero podría ser difícil saber qué es una hoja (N = 0) a menos que todas sus hojas se encuentren a la misma profundidad máxima.