JavaScript深度优先和广度优先遍历

515 阅读1分钟

1、广度优先遍历

 英文缩写为BFS即Breadth FirstSearch.其过程检验来说是对每一层节点依次访问,访问完一层进入下一层,而且每个节点只能访问一次。

2、深度优先遍历

英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。

// 深度优先--递归
function deepTraversal1(node, nodes = []) {
  if (node) {
    nodes.push(node)
    const children = node.children
    for (let i = 0; i < children.length; i++) {
      deepTraversal1(children[i], nodes)
    }
  }

  return nodes
}

// 深度优先--非递归
function deepTraversal2(node) {
  const nodes = []
  const stack = []
  if (node) {
    stack.push(node)
    while(stack.length) {
      const item = stack.pop()
      const children = item.children

      nodes.push(item)

      for (let i = children.length - 1; i >=0 ; i--) {
        stack.push(children[i])
      }
    }
  }

  return nodes
}

// 广度优先
function breadthTraversal(node) {
  const nodes = []
  const queue = []

  if (node) {
    queue.push(node)
    while(queue.length) {
      const item = queue.shift()
      const children = item.children

      nodes.push(item)
      for (let i = 0; i < children.length; i++) {
        queue.push(children[i])
      }
    }
  }

  return nodes
}