【js算法】--广度遍历和深度遍历

  • 广度优先遍历,先遍历全部邻接点,再往下遍历,按照dom树转为而二叉树有序遍历以下:
// 广度优先有序遍历:先访问全部邻节点
function Bfs(node, isChild){
  var firstChild = isChild ? node.firstElementChild : node.nextElementSibling;
  if(firstChild) {
    console.log(firstChild)
    if(firstChild.nextElementSibling) {
      Bfs(firstChild, 0)
    } else {
      Bfs(firstChild.parentNode.firstElementChild, 1)
    }
  } else {
    if(node.parentNode.nextElementSibling) {
      Bfs(node.parentNode.nextElementSibling, 1)
    } else {
      console.log('遍历结束')
    }
  }
}
Bfs(document.getElementById('root'), 1)
复制代码

// 广度优先遍历:非递归遍历,按照队列的先进先出
function Bfs(node){
  let nodes = []
  let stack = []
  if(node) {
    stack.push(node)
    while (stack.length) {
      let item = stack.shift()
      let children = item.children
      nodes.push(item)
      for(let i =0;i<children.length;i++) {
        stack.push(children[i])
      }
    }
  }
  return nodes
}
let nodes = Bfs(document.getElementById('root').firstElementChild)
console.log(nodes)
复制代码

  • 深度优先遍历:分为三种,先序(根-左-右),中序(左-根-右),后序(左-右-根)
//深度有序优先遍历:先序遍历根-左-右
function LeftDfs(node,isChild){
  var firstChild = isChild ? node.firstElementChild : node.nextElementSibling;
  if(firstChild) {
    console.log(firstChild)
    if(firstChild.firstElementChild) { // 先判断子节点
      LeftDfs(firstChild,1)
    } else if(firstChild.nextElementSibling){ // 在判断子节点的邻节点
      LeftDfs(firstChild,0)
    } else {
      LeftDfs(firstChild.parentNode, 0)
    }
  } else {
    console.log('遍历结束')
  }
}
LeftDfs(document.getElementById('root'),1)
复制代码

//非递归遍历,按照栈
let LeftDfs= (node) => {
  let stack = []
  let nodes = []
  if (node) {
    // 推入当前处理的node
    stack.push(node)
    while (stack.length) {
      let item = stack.pop()//出栈
      let children = item.children
      nodes.push(item)
      for (let i = children.length - 1; i >= 0; i--) {
        stack.push(children[i])
      }
    }
  }
  return nodes
}

//深度优先遍历:递归遍历
function LeftDfs(node, nodeTree){
  if(node !== null) {
    nodeTree.push(node)
    for(let i =0; i<node.children.length;i++) {
      LeftDfs(node.children[i],nodeTree)
    }
  }
  return nodeTree
}
let node = LeftDfs(document.getElementById('root').firstElementChild, [])
console.log(node)


复制代码

相关文章
相关标签/搜索