如何实现DFS和BFS?

  • DFS(深度优先搜索):遍历当前节点的全部子节点。再遍历同一级的节点
  • BFS(广度优先搜索):遍历兄弟节点,再遍历节点下的子节点

测试dom:

    <div id='root'>
        <span>123
            <a href="#">
                sdsd
            </a>
            <div>sdsd<a>这是一个a标签</a></div>
        </span>
        <span>456
            <p>这是一个p标签</p>
        </span>
    </div>

DFS递归实现:

    function deepTraversal(node, nodeList) {
      if (node) {
        nodeList.push(node)
        var children = node.children
        for (var i = 0; i < children.length; i++) {
          deepTraversal(children[i], nodeList)
        }
      }
      return nodeList
    }
    var root = document.getElementById('root')
    console.log(deepTraversal(root, nodeList = []))

DFS非递归实现:

   // DFS非递归实现
    function deepTraversal(node) {
      var nodeList = []
      if (node) {
        var stack = []
        stack.push(node)
        while (stack.length != 0) {
          var childrenItem = stack.pop()
          nodeList.push(childrenItem)
          var childrenList = childrenItem.children
          for (var i = childrenList.length - 1; i >= 0; i--) {
            stack.push(childrenList[i])
          }
        }
      }
      return nodeList
    }
    var root = document.getElementById('root')
    console.log(deepTraversal(root, nodeList = []))

 

BFS实现:

    function wideTraversal(node) {
      var nodes = []
      if (node != null) {
        var queue = []
        queue.unshift(node)
        while (queue.length != 0) {
          var item = queue.shift()
          nodes.push(item)
          var children = item.children
          for (var i = 0; i < children.length; i++) {
            queue.push(children[i])
          }
        }
      }
      return nodes
    }
    var root = document.getElementById('root')
    console.log(wideTraversal(root))

 

 

参考:https://www.jianshu.com/p/b4d8085e84bd

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值