0
我想在目標C中做一個DFS。給定根節點,它是一個視圖控制器,此視圖控制器也有一個視圖控制器的子數組。這些孩子中的每一個都可能有多個孩子,等等。我想從根節點開始訪問每個視圖控制器一次。深度目標C中的第一個搜索iphone
任何想法?
我想在目標C中做一個DFS。給定根節點,它是一個視圖控制器,此視圖控制器也有一個視圖控制器的子數組。這些孩子中的每一個都可能有多個孩子,等等。我想從根節點開始訪問每個視圖控制器一次。深度目標C中的第一個搜索iphone
任何想法?
一個簡單的遞歸方法是所有你需要:
- (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。
你想要什麼想法?是的,您可以先進行深度搜索。對象類型似乎不相關。 – bengoesboom
你有什麼試過的?爲什麼您認爲Objective-C中的DFS與其他語言中的DFS有什麼不同? –