L'implementazione classica degli alberi è la left-child right-sibling, dove ogni nodo ha un puntatore al suo primo figlio (left child) e un puntatore al suo fratello più prossimo (right sibling).
Se vuoi trovare la larghezza dell'albero puoi effettuare un breadth-first search (visita level-order) dove sostanzialmente ad ogni chiamata ricorsiva conti il numero di nodi che hai alla tua destra: se ho un fratello destro mi segno 1 e chiamo ricorsivamente, se ho un figlio chiamo ricorsivamente senza aumentare il counter della larghezza.
Se vuoi trovare il nodo con più figli puoi creare una funzione che ritorna il numero di figli di un dato nodo (un banale while) e utilizzarla in mezzo ad un qualsiasi algoritmo di visita.
Sono un pugno di righe di codice, devi solo capire bene cosa devi fare, ma in buona sostanza l'algoritmo te l'ho descritto.
C:
typedef int type;
struct Tree
{
struct Tree *lchild, *rsibling;
type data;
};
Se vuoi trovare la larghezza dell'albero puoi effettuare un breadth-first search (visita level-order) dove sostanzialmente ad ogni chiamata ricorsiva conti il numero di nodi che hai alla tua destra: se ho un fratello destro mi segno 1 e chiamo ricorsivamente, se ho un figlio chiamo ricorsivamente senza aumentare il counter della larghezza.
Se vuoi trovare il nodo con più figli puoi creare una funzione che ritorna il numero di figli di un dato nodo (un banale while) e utilizzarla in mezzo ad un qualsiasi algoritmo di visita.
Sono un pugno di righe di codice, devi solo capire bene cosa devi fare, ma in buona sostanza l'algoritmo te l'ho descritto.