本篇文章主要讲解了遍历:深度优先遍历、广度优先遍历。

遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<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>

深度优先遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
  // 递归
let 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 deepTraversal2 = (node) => {
let nodes = []
if (!node) {
nodes.push(node)
for(let i = 0; i < children.length; i++) {
nodes = nodes.concat(deepTraversal2(children[i]))
}
}
return nodes
}

// 非递归
let deepTraversal3 = (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
}

深度优先遍历结果如下

0: div.parent
1: div.child-1
2: div.child-1-1
3: div.child-1-1-1
4: div.child-1-2
5: div.child-1-2-1
6: div.child-1-3
7: div.child-2
8: div.child-2-1
9: div.child-2-2

广度优先遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let widthTraversal = (node) => {
let stack = []
let nodes = []
if (node) {
stack.push(node)
while(stack.length) {
let item = stack.shift() // 取第一个 先进先出
let children = item.children
nodes.push(item)
for (let i = children.length - 1; i >= 0; i--) {
stack.push(children[i])
}
}
return nodes
}
}

广度优先遍历结果如下

0: div.parent
1: div.child-2
2: div.child-1
3: div.child-2-2
4: div.child-2-1
5: div.child-1-3
6: div.child-1-2
7: div.child-1-1
8: div.child-1-2-1
9: div.child-1-1-1