广度优先遍历的基本思想

76 阅读1分钟

思想

树1.png

其实我们都知道 广度优先遍历 是个啥东西,难就难在我们 如何用程序来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));

树2.png

再测试一下:

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

树3.png

经过上面的测试我们发现,完全符合我们的预期。