二叉树的层序遍历
题目描述:
给你二叉树的根节点 root
,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]]
示例 2:
输入:root = [1] 输出:[[1]]
示例 3:
输入:root = [] 输出:[]
链接:
102. 二叉树的层序遍历 - 力扣(LeetCode) (leetcode-cn.com)
解题思路
思路一:广度优先搜索
广度优先需要用队列作为辅助结构:
- 首先根元素入队
- 当队列不为空的时候
- 求当前队列的长度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;
}