私は要素の配列を持っています。その要素のうちのいくつかは子を持ち、順番に子を持っています。私は各要素の直接の子を知っていて、各要素のすべての子孫のリストを持っています。ルートノードと任意の子の間の最長のパスを見つける
各要素の子孫の合計数を比較することで、ルート要素を判断できます。私はルートや、これを与えられた任意の要素との間の最短ルートを見つけることができます。
-(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;
}
私は何をしたい要素と根の間最長距離を見つけることです。私はゼロの子を持つ要素からツリーをバックアップするか、マッピング関数の要素間に距離の配列を追加することを考えています。最もクリーンなアプローチ - あらゆるアイデアに苦しんでいますか?
EDIT:以下user3290797の回答に基づいて ソリューション、両親の最大数への参照を追跡:
-(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;
}
ありがとう、ありがとう、この作業は単一ノードへの複数のパスでも行われます。 –
グラフにサイクルが含まれていない限り動作します。 – Anton
サイクルがありません!さて、午前中にコードを試してみます。ご協力いただきありがとうございます。 –