最近看手写浅拷贝和深拷贝一直刷到用深度优先遍历和广度优先遍历,想起以前大学也学过东西,老是容易忘,特此记录下写法
深度优先遍历
var arrResult: Array<string> = []
var testArr: Array<any> = [{
name: 'a',
children: [{
name: 'a1',
children: [{
name: 'a11'
}, {
name: 'a12'
}]
}, {
name: 'a2',
children: [{
name: 'a21'
}, {
name: 'a22'
}]
}, {
name: 'a3',
children: [{
name: 'a31'
}, {
name: 'a32'
}]
},],
}, {
name: 'b',
children: [{
name: 'b1',
children: [{
name: 'b11'
}, {
name: 'b12'
}]
}, {
name: 'b2',
children: [{
name: 'b21'
}, {
name: 'b22'
}]
}, {
name: 'b3',
children: [{
name: 'b31'
}, {
name: 'b32'
}]
},],
}];
function dfs(arr: any): void {
// 深度优先遍历递归放在for里面,遍历每个节点的时候递归下面的节点
for (var i = 0; i < arr.length; i++) {
arrResult.push(arr[i].name);
if (arr[i].children) {
dfs(arr[i].children)
}
}
}
dfs(testArr)
console.log(arrResult)
// [
// 'a', 'a1', 'a11', 'a12',
// 'a2', 'a21', 'a22', 'a3',
// 'a31', 'a32', 'b', 'b1',
// 'b11', 'b12', 'b2', 'b21',
// 'b22', 'b3', 'b31', 'b32'
// ]
广度优先遍历
var arrResult: Array<string> = []
var testArr: Array<any> = [{
name: 'a',
children: [{
name: 'a1',
children: [{
name: 'a11'
}, {
name: 'a12'
}]
}, {
name: 'a2',
children: [{
name: 'a21'
}, {
name: 'a22'
}]
}, {
name: 'a3',
children: [{
name: 'a31'
}, {
name: 'a32'
}]
},],
}, {
name: 'b',
children: [{
name: 'b1',
children: [{
name: 'b11'
}, {
name: 'b12'
}]
}, {
name: 'b2',
children: [{
name: 'b21'
}, {
name: 'b22'
}]
}, {
name: 'b3',
children: [{
name: 'b31'
}, {
name: 'b32'
}]
},],
}];
function bfs(arr: Array<any>): void {
var temp = []
// 广度优先遍历 递归放外面 遍历完平行节点后再遍历子节点的平行节点
for (var i of arr) {
arrResult.push(i.name)
if(i.children){
// 把所有平行节点放到一个数组里面递归
temp.push(...i.children)
}
}
if(temp.length){
bfs(temp)
}
}
bfs(testArr)
console.log(arrResult)
// [
// 'a', 'b', 'a1', 'a2',
// 'a3', 'b1', 'b2', 'b3',
// 'a11', 'a12', 'a21', 'a22',
// 'a31', 'a32', 'b11', 'b12',
// 'b21', 'b22', 'b31', 'b32'
// ]