思想
其实我们都知道 广度优先遍历 是个啥东西,难就难在我们 如何用程序来show我们的思想 。
代码
- 我们应该一层一层的遍历,然后收集当前层每个节点的value。
- 如何一层一层的遍历?我们可以将树放到数组里。
- 初始化时,我们的
数组A形态:[9],当前节点肯定知道自己的后代情况。 - 经过处理,到达第二层,我们的
数组B形态应该是这样:[6, 12]。 - 在经过处理,到达第三层,我们的
数组C形态应该是这样:[5, 7, 11, 13]。 - 最后,处理完最后一层后,我们的
数组D形态应该是这样:[]。 - 最后一个问题,如何将数组A-D蹿起来?那么他们都应该用同一个
变量E来管理,然后遍历的时候直接while变量E就可以。
function BFS (tree){
if (!tree){
return [];
}
let temp = [tree];
let level = 0;
let result = new Map();
while (temp.length > 0){
let arr1 = [];
for (let index = 0; index < temp.length; index++){
if (result.get(`${level}`)){
let prevResult = [...result.get(`${level}`)];
prevResult.push(temp[index]?.value);
result.set(`${level}`, prevResult );
} else {
result.set(`${level}`, [temp[index]?.value]);
}
temp[index].left && arr1.push(temp[index].left);
temp[index].right && arr1.push(temp[index].right);
}
temp = [...arr1];
level++;
}
return result;
}
现在我们来测试一下这个函数:
function TreeNode (value){
this.value = value;
this.left = null;
this.right = null;
}
let root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
console.log(BFS(root));
再测试一下:
function TreeNode (value){
this.value = value;
this.left = null;
this.right = null;
}
let root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
console.log(BFS(root));
经过上面的测试我们发现,完全符合我们的预期。