美文网首页
深度优先遍历和广度优先遍历

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

作者: 海山城 | 来源:发表于2019-04-02 11:41 被阅读0次

以html节点为列进行深度优先和广度优先遍历

<div class="parent">
  <div class="child-1">
    <div class="child-1-1">
      <div class="child-1-1-1">
        1-1-1
      </div>
    </div>
    <div class="child-1-2">
      <div class="child-1-2-1">
        1-2-1
      </div>
      <div class="child-1-2-2">
        1-2-2
      </div>
    </div>
    <div class="child-1-3">
      1-3
    </div>
  </div>
  <div class="child-2">
    <div class="child-2-1">
      2-1
    </div>
    <div class="child-2-2">
      <div class="child-2-2-1">
        2-2-1
      </div>
    </div>
  </div>
  <div class="child-3">
    <div class="child-3-1">
      3-1
    </div>
  </div>
</div>
1. 深度优先遍历
  • 递归
// 方法1,传参保存结果
function deepTraversal1(node, nodeList = []) {
  if (node) {
    nodeList.push(node)
    let children = node.children
    for (let i = 0; i < children.length; i++) {
      deepTraversal1(children[i], nodeList)
    }
  }
  return nodeList
}
let result = deepTraversal1(document.querySelector(".parent"))
console.log(result)

// 方法2,concat拼凑结果
function deepTraversal2(node) {
  let nodeList = []
  if (node) {
    nodeList.push(node)
    let children = node.children
    for (let i = 0; i < children.length; i++) {
      nodeList = nodeList.concat(deepTraversal2(children[i]))
    }
  }
  return nodeList
}
let result = deepTraversal2(document.querySelector(".parent"))
console.log(result)
  • 非递归,栈表示法
function deepTraversal3(node) {
  let stack = [], nodeList = []
  if (node) {
    stack.push(node)
    let children = node.children
    while(stack.length) {
      let item = stack.pop()
      nodeList.push(item)
      let children = item.children
      for (let i = children.length - 1; i >= 0; i--) {
        stack.push(children[i])
      }
    }
  }
  return nodeList
}

let result = deepTraversal3(document.querySelector(".parent"))
console.log(result)
深度优先遍历
2. 广度优先遍历
  • 队列表示法
function widthTraversal(node) {
  let queue = [], nodeList = []
  if (node) {
    queue.push(node)
    while(queue.length) {
      let item = queue.shift()
      let children = item.children
      nodeList.push(item)
      for (let i = 0; i < children.length; i++) {
        queue.push(children[i])
      }
    }
  }
  return nodeList
}
广度优先遍历

相关文章

网友评论

      本文标题:深度优先遍历和广度优先遍历

      本文链接:https://www.haomeiwen.com/subject/ixbbbqtx.html