LeedCode 102:二叉树的层序遍历

200 阅读2分钟

LeedCode 102:二叉树的层序遍历

题目描述:

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)

示例 1: 

输入: root = [3,9,20,null,null,15,7]
输出: [[3],[9,20],[15,7]]

 示例 2:

输入: root = [1]
输出: [[1]]

示例 3:

输入: root = []
输出: []

解题思路 

思路一: 广度优先搜索

广度优先需要用队列作为辅助结构:

  • 先将根节点放到队列中,然后不断遍历队列

  • 当队列不为空的时候

    • 求当前队列的长度length
    • 依次从队列中取 length个元素(即是第 i 层的所有元素,并且按照从左向右的顺序排列)进行拓展,然后进入下一次迭代;
  • 队列为空,执行完成,返回结果;

实现代码如下:

/**
 * @param {TreeNode} root
 * @return {number[][]}
 */
var levelOrder = function (root) {
  if (root === null) return [];
  var res = [], queue = [root];
  while (queue.length) {
    var currentLevelSize = queue.length;
    res.push([]);
    for (let i = 1; i <= currentLevelSize; ++i) {
      var node = queue.shift();
      res[res.length - 1].push(node.val);
      if (node.left !== null) queue.push(node.left);
      if (node.right !== null) queue.push(node.right);
    }
  }

  return res;
};

时间复杂度: O(n); 每个点进队出队各一次

空间复杂度: O(n); 队列中元素的个数不超过 n 个

思路二:深度优先搜索

每次递归的时候都需要带一个 index(表示当前的层数),如果对应的 结果 不存在,就加入一个空 数组 进去。并且将当前节点的值push进去。
然后递归的处理左子树,右子树,同时将层数index+1;
最后节点为空,返回结果。

实现代码如下:

var levelOrder = function (root) {
  if (root === null) return [];
  var res = [];
  var dfs = function (node, depth) {
    if (node === null) return;
    res[depth] = res[depth] || [];
    res[depth].push(node.val);
    dfs(node.left, depth + 1);
    dfs(node.right, depth + 1);
  }
  dfs(root, 0);
  return res;
}

时间复杂度: O(n);

空间复杂度: O(h); h 是二叉树的高度

参考资料

二叉树的层序遍历 - 力扣(LeetCode)