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);