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 是二叉树的高度