算法--深度优先遍历和广度优先遍历

299 阅读1分钟

1. 深度优先遍历(DFS, Depth-First-Search)是从树的根节点开始,按照左子树、当前节点、右子树顺序对节点进行遍历(先序遍历)。一条道走到黑,只要有子节点就先遍历子节点,没有子节点再找父节点的其他子节点。

// DFS

function depthFirstSearch(node, nodeList = []) {
  if (node) {
    nodeList.push(node)
  }
  if (node.children) {
    let child = node.children
    for (let i = 0, len = child.length; i < len; i ++) {
      depthFirstSearch(child[i])
    }
  }
  return nodeList
}

2. 广度优先遍历(BFS, Breadth-First-Search)是从树的根节点开始,一层一层对节点进行遍历。一层层剥洋葱,有兄弟节点就先遍历兄弟节点,没有兄弟节点再找子节点。

// BFS

function breadthFirstSearch(node, nodeList = []) {
  if (node) {
    let stack = [node]
    while (stack.length > 0) {
      let item = stack.shift()
      nodeList.push(item)
      if (item.children) {
        let child = item.children
        for (let i = 0, len = child.length; i < len; i ++) {
          stack.push(child[i])
        }
      }
    } 
  }
  return nodeList
}