给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例: 二叉树:[3,9,20,null,null,15,7],

  1. 3
  2. / \
  3. 9 20
  4. / \
  5. 15 7

返回其层次遍历结果:

  1. [
  2. [3],
  3. [9,20],
  4. [15,7]
  5. ]

思路

BFS+队列实现,在对二叉树进行层序遍历时,每一次 while 循环其实都对应着二叉树的某一层。只要我们在进入while循环之初,记录下这一层结点个数,然后将这个数量范围内的元素 push 进同一个数组,就能够实现二叉树的分层。

  1. /**
  2. * @param {TreeNode} root
  3. * @return {number[][]}
  4. */
  5. const levelOrder = function(root) {
  6. // 初始化结果数组
  7. const res = []
  8. // 处理边界条件
  9. if(!root) {
  10. return res
  11. }
  12. // 初始化队列
  13. const queue = []
  14. // 队列第一个元素是根结点
  15. queue.push(root)
  16. // 当队列不为空时,反复执行以下逻辑
  17. while(queue.length) {
  18. // level 用来存储当前层的结点
  19. const level = []
  20. // 缓存刚进入循环时的队列长度,这一步很关键,因为队列长度后面会发生改变
  21. const len = queue.length
  22. // 循环遍历当前层级的结点
  23. for(let i=0;i<len;i++) {
  24. // 取出队列的头部元素
  25. const top = queue.shift()
  26. // 将头部元素的值推入 level 数组
  27. level.push(top.val)
  28. // 如果当前结点有左孩子,则推入下一层级
  29. if(top.left) {
  30. queue.push(top.left)
  31. }
  32. // 如果当前结点有右孩子,则推入下一层级
  33. if(top.right) {
  34. queue.push(top.right)
  35. }
  36. }
  37. // 将 level 推入结果数组
  38. res.push(level)
  39. }
  40. // 返回结果数组
  41. return res
  42. };