我想在目标 C 中做一个 DFS。鉴于根节点是一个视图控制器,并且这个视图控制器有一个子数组,它们也是视图控制器。这些孩子中的每一个都可以有多个孩子,等等。我想从根节点开始访问每个视图控制器一次。
有任何想法吗 ?
我想在目标 C 中做一个 DFS。鉴于根节点是一个视图控制器,并且这个视图控制器有一个子数组,它们也是视图控制器。这些孩子中的每一个都可以有多个孩子,等等。我想从根节点开始访问每个视图控制器一次。
有任何想法吗 ?
您只需要一个简单的递归方法:
- (void)processViewController:(UIViewController *)controller {
for (UIViewController *child in controller.childViewController) {
[self processViewController:child];
}
// process "controller" here
}
要启动它:
UIViewController *root = ... // some view controller
[self processViewController:root];
我知道我的代码并不完美,但您对此有何看法?
#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 中。