J'ai un tableau d'éléments, dont certains ont des enfants, qui ont des enfants à leur tour et ainsi de suite. Je connais les enfants directs de chaque élément, et j'ai une liste de tous les descendants pour chaque élément.Trouver le chemin le plus long entre le nœud racine et n'importe quel enfant
-(NSMutableArray *)descendents:(Element *)e {
NSMutableArray * descendents = [NSMutableArray new];
for (NSString * uID in e.children){
[descendents addObject:uID];
Element * k = elements[uID][@"element"];
[descendents addObjectsFromArray:[self descendents:k]];
}
return descendents;
}
Je peux déterminer l'élément racine en comparant le nombre total de descendants pour chaque élément. Je peux trouver le plus court chemin entre la racine et un élément donné donné ceci:
-(int)find:(NSString *)uniqueID forElement:(Element *)e {
int distance = 0;
if ([e.children containsObject:uniqueID]){ //immediate child
distance ++; //increment distance
return distance; //return
} else if ([e.descendents containsObject:uniqueID]){ //grand child etc
distance ++;
for (NSString * uID in e.children){
Element * k = elements[uID][@"element"];
distance += [self find:uniqueID forElement:k];
return distance;
}
}
return 0;
}
Ce que je veux faire est de trouver la plus longue distance entre un élément et la racine. Je pense à remonter l'arbre à partir d'éléments sans enfants ou à ajouter un tableau de distances entre les éléments de la fonction de mappage. Luttant pour l'approche la plus propre - des idées?
EDIT: solution basée sur la réponse de user3290797 ci-dessous, suivi de référence au nombre maximum de les parents:
-(int)parentHeight:(NSString *)uID {
int maxHeight = 0;
Element * e = elements[uID][@"element"];
for (NSString * parentID in e.parents){
int height = [self parentHeight:parentID];
maxHeight = (height > maxHeight) ? height : maxHeight;
}
return maxHeight + 1;
}
Merci, cela fonctionne même avec plusieurs chemins vers un seul nœud, dont certains sont plus longs que d'autres? –
Cela fonctionne tant que le graphique ne contient pas de cycles. – Anton
Pas de cycles! Ok, je vais essayer le code le matin. Merci de votre aide. –