深度優先遍歷:豎向優先遍歷
const data = [
{
name: 'a',
children: [
{ name: 'b', children: [{ name: 'e' }, children: [{name: 'h'}]] },
{ name: 'c', children: [{ name: 'f' }] },
{ name: 'd', children: [{ name: 'g' }] },
],
},
{
name: 'a2',
children: [
{ name: 'b2', children: [{ name: 'e2' }] },
{ name: 'c2', children: [{ name: 'f2' }] },
{ name: 'd2', children: [{ name: 'g2' }] },
],
}
]
// 遞歸
function DFS(arr) {
let stack = []
arr.forEach(v => {
const { name, children } = v
stack = [...stack, name].concat(children ? DFS(children) : [])
})
return stack
}
function DFS(arr) {
const stack = []
const map = (item) => {
item.forEach(v => {
const { name, children } = v
stack.push(name)
children && map(children)
})
}
map(arr)
return stack
}
// 循環
function DFS(arr) {
const stack = []
while(arr.length) {
const { name, children } = arr.shift()
stack.push(name)
if (children) {
arr = [...children, ...arr]
}
}
return stack
}
// reduce 遞歸
function DFS (arr) {
if (!arr) return []
return arr.reduce((v, k) => {
const { name, children } = k
let b = DFS(children)
return [...v, name, ...b]
}, [])
}
// ["a", "b", "e", "c", "f", "d", "g", "a2", "b2", "e2", "c2", "f2", "d2", "g2"]
廣度優先遍歷:橫向優先遍歷
// 遞歸
function BFS (arr) {
const stack = []
let queue = []
arr.forEach(v => {
const { name, children } = v
stack.push(name)
if (children) queue = [...queue, ...children]
})
return queue.length ? [...stack, ...BFS(queue)] : stack
}
// 循環
function BFS(arr) {
const stack = []
const copy = [...arr]
while(arr.length) {
const { name, children } = arr.shift()
stack.push(name)
if (children) {
arr = [...arr, ...children]
}
}
return stack
}