二叉树的层遍历。
广度优先 和 二叉树 并不是绑定关系。也可以这么说,广度优先和深度优先都算不上算法,只能说是核心基础代码能力的考察。
模版:(经典的写法)

  1. function test(nums) {
  2. const queue = [first]; // 初始条件!!
  3. while (queue.length > 0) {
  4. let size = queue.length; // 固定这一层要遍历的范围
  5. for (let i = 0; i < size; i++) {
  6. let curWord = queue.shift(); // 弹出处理本层
  7. // 为一层添加东西
  8. queue.push(curWord.nextSon());
  9. queue.push(curWord.nextSon());
  10. }
  11. // queue 此时仅包含下一层所有东西
  12. for (let item of queue) {
  13. // ...
  14. }
  15. }
  16. }

127. Word Ladder

在搜索接龙单词时,按照流程,我们要一层一层搜索:
比如 big 的下一个单词可能是 bag bug …. 再由bag 和 bug 来扩展就可以。

  1. var ladderLength = function(beginWord, endWord, wordList) {
  2. if (wordList.length === 0 || !wordList.includes(endWord)) {
  3. return 0;
  4. }
  5. const wordDict = new Set(wordList); // set 查找速度比 array 快的多
  6. const queue = [beginWord];
  7. let step = 1;
  8. while (queue.length > 0) {
  9. let size = queue.length;
  10. for (let i = 0; i < size; i++) {
  11. let curWord = queue.shift();
  12. const result = didMatch(curWord, endWord);
  13. if (result) {
  14. return step + 1;
  15. }
  16. }
  17. step++;
  18. }
  19. function didMatch(curWord, targetWord) { // curWord 和 targetWord 长度相同
  20. for (let i = 0; i < curWord.length; i++) { // 每个字符都要替换比较
  21. for (let c = 97; c < 123; c++) {
  22. let changedChar = String.fromCharCode(c);
  23. let changedWord = curWord.slice(0, i) + changedChar + curWord.slice(i + 1);
  24. if (changedWord === targetWord) { // 找到了最终的
  25. return true;
  26. }
  27. if (wordDict.has(changedWord)) { // 找到了半成品
  28. queue.push(changedWord);
  29. wordDict.delete(changedWord); // 匹配过的就删了
  30. }
  31. }
  32. }
  33. return false;
  34. }
  35. return 0;
  36. };