获取两节点间的所有路径(非递归)

要在 JavaScript 中使用非递归的方式获取两个节点之间的所有路径,我们可以使用栈(Stack)来实现深度优先搜索(DFS),如果使用递归,数据量大可能会内存溢出;

class customGraph {
    nodes: Map<any, any>;
    constructor() {
        this.nodes = new Map();
    }
    addNode(node: string) {
        this.nodes.set(node, []);
    }
    addEdge(node1: string, node2: string) {
        this.nodes.get(node1).push(node2);
        // this.nodes.get(node2).push(node1);
    }
    dfs(graph: Map<any, any>, current: string, end: string, depth: number, path: any[], paths: any[][], visited: Set<unknown>) {
        if (current === end) {
            paths.push([...path]);
            return;
        }
        if (depth === 0) {
            return;
        }
        visited.add(current);
        for (let neighbor of graph.get(current)) {
            if (!visited.has(neighbor)) {
                path.push(neighbor);
                this.dfs(graph, neighbor, end, depth - 1, path, paths, visited);
                path.pop();
            }
        }
        visited.delete(current);
    }
    getAllPaths(node1: string, node2: string) {
        const paths: any[] = [];
        const visited = new Set();
        const graph = this.nodes
        for (let depth = 1; depth <= 4; depth++) {
            this.dfs(graph, node1, node2, depth, [node1], paths, visited);
        }
        console.log('paths信息:', paths);
        return paths;
    }
}
export default customGraph

// index.tsx

// 创建一个图
let graph = new customGraph();
graph.addNode('A');
graph.addNode('B');
graph.addNode('C');
graph.addNode('D');
graph.addNode('E');

graph.addEdge('A', 'B');
graph.addEdge('A', 'C');
graph.addEdge('B', 'D');
graph.addEdge('C', 'E');
graph.addEdge('D', 'E');

let node1 = 'A';
let node2 = 'E';

let paths = graph.getAllPaths(node1, node2);
console.log(paths);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容