我有一系列元素,其中一些有孩子,轮流有孩子等等。我知道每个元素的直接子元素,并列出每个元素的所有后代。
-(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;
}
我可以通过比较每个元素的后代总数来确定根元素。我可以找到根和任何给定元素之间的最短路径:
-(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;
}
我想要做的是找到元素和根之间的最长距离。我正在考虑从具有零子元素的元素返回树,或者在映射函数中添加元素之间的距离数组。挣扎于最干净的方法 - 任何想法?
修改 解决方案基于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;
}
答案 0 :(得分:1)
如果不是很多节点,计算每个距离并为每个节点分配一个ID,那么检查它们中最长的,这很慢但是工作哈哈哈
答案 1 :(得分:1)
元素与根之间的最长距离称为树的高度(或深度)。
找到它的一种方法是递归遍历树并计算每个节点的高度,作为其子高度的最大值加一。
在伪代码中:
function height(node) {
maxChildHeight = 0
for(child in node.children) {
h = height(child)
if(h > maxChildHeight) {
maxChildHeight = h
}
}
return maxChildHeight + 1
}