深度優先遍歷DFS和廣度優先遍歷BFS

深度優先遍歷:豎向優先遍歷
在這裏插入圖片描述

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
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章