深度优先遍历

例图

                A
           B    C    D
        E    F    G    H     
从启点出发,找到其一个子元素,然后继续找到子元素的一个子元素,直至没有子元素。然后这个没有子元素的父元素开始继续依次找到其子元素。直到全部。

1.从顶点A触发,找到其第一个子元素B然后再向下找到B的第一个子元素E,此时E已没有子元素。 (一层一层深入下去,顾算法名为深度遍历)
2.因E没有子元素,所以返回到E的父元素B,找至其领一个子元素F。发现F也无子元素
3.因F无子元素。所以返回F的父元素B,因B无其他元素。所以返回至B的父元素A
4.继续从A找寻未定位过的元素。C和D方法同

code

HTML

   <div class="parent">
    <div class="child-1">
      <div class="child-1-1">
        <div class="child-1-1-1">
          a
        </div>
      </div>
      <div class="child-1-2">
        <div class="child-1-2-1">
          b
        </div>
      </div>
      <div class="child-1-3">
        c
      </div>
    </div>
    <div class="child-2">
      <div class="child-2-1">
        d
      </div>
      <div class="child-2-2">
        e
      </div>
    </div>
    <div class="child-3">
      <div class="child-3-1">
        f
      </div>
    </div>
   </div>

JS

    let deepTraversal1 = (node, nodeList = []) => {
      if (node !== null) {
        nodeList.push(node)
        let children = node.children
        for (let i = 0; i < children.length; i++) {
          deepTraversal1(children[i], nodeList)
        }
      }
      return nodeList
    }

广度优先遍历

与深度相反,广度优先匹配兄弟节点(元素)

code

jS

    let widthTraversal2 = (node) => {
      let nodes = []
      let stack = []
      if (node) {
        stack.push(node)
        while (stack.length) {
          let item = stack.shift()
          let children = item.children
          nodes.push(item)
            // 队列,先进先出
            // nodes = [] stack = [parent]
            // nodes = [parent] stack = [child1,child2,child3]
            // nodes = [parent, child1] stack = [child2,child3,child1-1,child1-2]
            // nodes = [parent,child1,child2]
          for (let i = 0; i < children.length; i++) {
            stack.push(children[i])
          }
        }
      }
      return nodes
    }

Last modification:August 26, 2019
如果觉得文章对你有所收获,可以请笔者喝杯咖啡