0

我想在目标 C 中做一个 DFS。鉴于根节点是一个视图控制器,并且这个视图控制器有一个子数组,它们也是视图控制器。这些孩子中的每一个都可以有多个孩子,等等。我想从根节点开始访问每个视图控制器一次。

有任何想法吗 ?

4

2 回答 2

1

您只需要一个简单的递归方法:

- (void)processViewController:(UIViewController *)controller {
    for (UIViewController *child in controller.childViewController) {
        [self processViewController:child];
    }

    // process "controller" here
}

要启动它:

UIViewController *root = ... // some view controller
[self processViewController:root];
于 2013-05-16T21:56:28.443 回答
0

我知道我的代码并不完美,但您对此有何看法?

#pragma mark - Stack 

@interface Stack : NSMutableArray
- (id)push:(id)item;
- (id)pop;
- (void)clear;
@end

#pragma mark - Interface of 'Node'

@interface Node : NSObject
@property(nonatomic, strong) NSMutableSet *linkedNodesSet;
@end

深度优先搜索方法 - (只是为了简单,没有参数)

- (void)dfs
{
    id rootNode = nil;

    NSMutableSet *visitedNodes = [NSMutableSet setWithObject:rootNode];
    Stack *stack = [[Stack alloc] init];
    [stack push:rootNode];

    while (stack.count > 0)
    {
        NSSet *linkedNodes = ((Node *)stack.lastObject).linkedNodesSet;

        if (!linkedNodes)
        {
            [stack pop];
            continue;
        }

        if ([self isEveryLinkedNodeVisited:linkedNodes
                       fromVisitedNodesSet:visitedNodes])
        {
            [stack pop];
            continue;
        }

        Node *node = linkedNodes.anyObject;

        if (![visitedNodes containsObject:node])
        {
            [visitedNodes addObject:node];
            [stack push:node];

            continue;
        }
    }
}

- (BOOL)isEveryLinkedNodeVisited:(NSSet *)linkedNodes
             fromVisitedNodesSet:(NSMutableSet *)visitedNodesSet
{
    for (Node *node in linkedNodes)
    {
        if (![visitedNodesSet containsObject:node])
            return NO;
    }

    return YES;
}

我知道它正在工作,但实际上我想用递归方式优化这些代码,但不知道如何在 OBJC 中。

于 2013-10-22T00:18:37.077 回答