美文网首页
JS 深度优先遍历(DFS)和广度优先遍历(BFS)

JS 深度优先遍历(DFS)和广度优先遍历(BFS)

作者: 同路半生 | 来源:发表于2020-06-14 16:19 被阅读0次

    深度优先遍历DFS

    自定义:深度单线游走,从根走完最后一个节点,在游走兄弟节点,走完兄弟的所有子节点,循环之。

         递归算法:

    function deepFirstSearch(node, nodeList = []) {

      if (node) {

        nodeList.push(node);

        var children = node.children;

        for (var i = 0; i < children.length; i++)

          //每次递归的时候将 需要遍历的节点 和 节点所存储的数组传下去

          deepFirstSearch(children[i], nodeList);

      }

      return nodeList;

    }


    非递归算法:

    function deepFirstSearch(node) {

      var nodes = [];

      if (node != null) {

        var stack = [];

        stack.push(node);

        while (stack.length != 0) {

          var item = stack.pop();

          nodes.push(item);

          var children = item.children;

          for (var i = children.length - 1; i >= 0; i--)

            stack.push(children[i]);

        }

      }

      return nodes;

    }


    广度优先遍历(BFS)

    自定义:从根开始 层层推进 走完一层 走下一层 (犹如爬楼,走完一层的楼梯,继续下一层的楼梯)

    递归算法:(容易栈溢出)

    function breadthFirstSearch(node) {

      var nodes = [];

      var i = 0;

      if (!(node == null)) {

        nodes.push(node);

        breadthFirstSearch(node.nextElementSibling);

        node = nodes[i++];

        breadthFirstSearch(node.firstElementChild);

      }

      return nodes;

    }


    非递归算法:(推荐)

    function breadthFirstSearch(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;

    }

    相关文章

      网友评论

          本文标题:JS 深度优先遍历(DFS)和广度优先遍历(BFS)

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