找到根节点和任何子节点之间的最长路径

时间:2017-01-19 21:43:27

标签: ios objective-c algorithm breadth-first-search depth-first-search

我有一系列元素,其中一些有孩子,轮流有孩子等等。我知道每个元素的直接子元素,并列出每个元素的所有后代。

-(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;
}

enter image description here

2 个答案:

答案 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
}