深度优先遍历和广度优先遍历

150 阅读1分钟
const data = [
    {
        name: 'a',
        children: [
            { name: 'b', children: [{ name: 'e' }] },
            { name: 'c'/*, children: [{ name: 'f' }]*/ },
            {name: 'd', children: [{ name: 'g', children: [{ name: "g1" }, { name: "g2" }]}]}
	    ]
    },
    {
        name: 'a2',
        children: [
            { name: 'b2', children: [{ name: 'e2' }] },
            { name: 'c2', children: [{ name: 'f2' }] },
            { name: 'd2', children: [{ name: 'g2' }] },
        ],
    }
]

// 深度优先遍历
function dfs(data) {
	data.forEach(item => {
		console.log(">>>>dfs", item.name);
		item.children && dfs(item.children);
	});
}

// 广度优先遍历
function bfs(data) {
	let queue = [];
	data.forEach(item => {
		console.log(">>>>bfs", item.name);
		item.children && (queue = queue.concat(item.children));
	})
	queue.length > 0 && bfs(queue);
}

// 深度优先遍历(非递归)
function deepFirseSearch(data) {
	let stack = [...data].reverse();
	while(stack.length > 0) {
		const item = stack.pop();
		const children = item.children || [];
		const { length: len } = children;
		console.log(">>>>deepFirseSearch", item.name);
		for (var i=len-1; i>=0; i--) {
			const child = children[i];
			stack.push(child);
		}
	}
}

// 广度优先遍历(非递归)
function breadthFirseSearch(data) {
	const queue = [...data];
	while(queue.length > 0) {
		const item = queue.shift();
		const children = item.children || [];
		const { length: len } = children;
		console.log(">>>>breadthFirseSearch", item.name);
		for (var i=0; i<len; i++) {
			queue.push(children[i]);
		}
	}
}

bfs(data);
breadthFirseSearch(data);

dfs(data);
deepFirseSearch(data);