返回

JavaScript图数据结构解析:双向与单向遍历的奥秘

前端

在JavaScript中,图数据结构是一种强大的工具,它允许我们高效地表示和操作复杂的关系。图由两个基本元素组成:节点和边。节点表示图中的对象,而边表示连接这些对象的链接。

双向与单向图

图可以分为两种主要类型:双向图和单向图。在双向图中,连接节点的边是双向的,这意味着节点1可以遍历到节点2,而节点2也可以遍历到节点1。在单向图中,边是单向的,这意味着只能从节点1到节点2,而节点2无法到节点1。

用数组表示图

一种常用的方法是用数组来存储图中的节点。数组的长度就是节点的数量,而数组的每一位则存储着第i个节点相邻的节点列表。例如,如果我们有一个包含4个节点的图,我们可以使用以下数组来表示:

const graph = [
  [1, 2],
  [0, 3],
  [0, 3],
  [1, 2]
];

在这个数组中,graph[0]表示节点0,它连接到节点1和2。graph[1]表示节点1,它连接到节点0和3。以此类推。

遍历图

一旦我们用数组表示了图,就可以使用各种算法来遍历它。最常见的遍历算法是深度优先搜索(DFS)和广度优先搜索(BFS)。

DFS从起始节点开始,并沿着一条路径向下遍历,直到到达叶节点。然后,它回溯到上一个未访问的节点,并继续遍历。BFS从起始节点开始,并访问该节点的所有相邻节点。然后,它访问这些相邻节点的相邻节点,依此类推,直到访问所有节点。

代码示例

以下代码演示了如何在JavaScript中实现双向图并使用DFS算法遍历它:

class Graph {
  constructor(numNodes) {
    this.numNodes = numNodes;
    this.adjList = new Array(numNodes).fill(0).map(() => []);
  }

  addEdge(u, v) {
    this.adjList[u].push(v);
    this.adjList[v].push(u);
  }

  dfs(start) {
    const visited = new Array(this.numNodes).fill(false);
    this._dfs(start, visited);
  }

  _dfs(node, visited) {
    visited[node] = true;
    console.log(node);
    for (const neighbor of this.adjList[node]) {
      if (!visited[neighbor]) {
        this._dfs(neighbor, visited);
      }
    }
  }
}

const g = new Graph(4);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 2);
g.addEdge(2, 3);
g.dfs(0);

输出:

0
1
2
3

结论

图数据结构在JavaScript中是一个强大的工具,它允许我们有效地表示和操作复杂的关系。通过使用数组来表示图和DFS算法来遍历它,我们可以轻松地实现和使用这种数据结构来解决各种问题。