本文共 1986 字,大约阅读时间需要 6 分钟。
在本文中,我们将使用邻接表来表示图数据结构。每个节点(GraphNode)将包含以下属性:
value:表示节点的值。adjacentNodes:表示该节点的邻接节点列表。深度优先搜索(DFS)是一种通过递归或栈来实现的图遍历算法。在本文中,我们将采用递归的方式实现DFS算法。
以下是实现DFS算法的完整代码示例:
#import@interface GraphNode : NSObject@property (nonatomic) id value;@property (nonatomic, retain)NSMutableArray *adjacentNodes;@end@implementation GraphNode@end@interface Graph : NSObject@property (nonatomic, retain) NSMutableArray *nodes;@end@implementation Graph- (void)initializeGraphWithNodesCount:(NSInteger)nodesCount { self.nodes = [[NSMutableArray alloc] init]; for (NSInteger i = 0; i < nodesCount; i++) { [self.nodes addObject:[[GraphNode alloc] init]]; }}- (void)addEdgeBetweenNodeAtIndex:(NSInteger)from andNodeAtIndex:(NSInteger)to { GraphNode *fromNode = self.nodes[from]; GraphNode *toNode = self.nodes[to]; [fromNode.adjacentNodes addObject:toNode]; [toNode.adjacentNodes addObject:from];}- (void)dfsTraversalFromNodeAtIndex:(NSInteger)startIndex { GraphNode *node = self.nodes[startIndex]; [self dfsTraversalFromNode:node];}- (void)dfsTraversalFromNode:(GraphNode *)node) { // 访问当前节点 NSLog(@"访问:%@", node.value); // 遍历所有邻接节点 [node.adjacentNodes enumerateObjectsUsingBlock:^(GraphNode *adjacentNode, BOOL *isStopped) { [self dfsTraversalFromNode:adjacentNode]; // 如果中途返回,则可以停止进一步搜索 if (*isStopped) { return; } }];}@end
在上述代码中,我们定义了一个图的节点类GraphNode和一个图类Graph。以下是代码的主要部分:
节点类(GraphNode):
value属性用于存储节点的值。adjacentNodes属性是一个NSMutableArray,用于存储该节点的所有邻接节点。图类(Graph):
initializeGraphWithNodesCount:方法用于初始化一个包含指定节点数量的图。addEdgeBetweenNodeAtIndex:方法用于在指定的两个节点之间添加边。dfsTraversalFromNodeAtIndex:方法用于从指定节点开始进行DFS遍历。dfsTraversalFromNode:方法是递归实现的DFS遍历方法。它首先访问当前节点,然后递归地遍历所有邻接节点。DFS遍历:
isStopped标志),则可以立即停止进一步的搜索。在实际应用中,可以根据需要自定义节点的值和邻接关系。DFS算法非常适合用于图的完整搜索,能够深入探索每一个可能的路径。
转载地址:http://innfk.baihongyu.com/