2013-05-16 33 views
0

我想在目標C中做一個DFS。給定根節點,它是一個視圖控制器,此視圖控制器也有一個視圖控制器的子數組。這些孩子中的每一個都可能有多個孩子,等等。我想從根節點開始訪問每個視圖控制器一次。深度目標C中的第一個搜索iphone

任何想法?

+4

你想要什麼想法?是的,您可以先進行深度搜索。對象類型似乎不相關。 – bengoesboom

+2

你有什麼試過的?爲什麼您認爲Objective-C中的DFS與其他語言中的DFS有什麼不同? –

回答

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]; 
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。