二叉树的层次遍历
从左到右访问所有节点
逐层地,从左到右访问所有节点,返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
实现思路:
创建一个数组存放结果,一个队列存放二叉树的节点,根据输出的要求,设置一个level, 存储当前层数,如果存放二叉树的队列不为空,就重复下面的操作
- 将队列的第一个节点作为根节点,并放入当前层的结果数组中
- 如果该节点的左子树不为空,将其放入队列中
- 如果该根节点的右子树不为空,就将其放入队列中
- 遍历完该层之后,就遍历下一层
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
var levelOrder = function(root){
if(!root){
return []
}
let queue = [root]
let result = [];
let level = 0;
while(queue.length !== 0){
result[level] = [];
let levelNum = queue.length;
while(levelNum --){
let node = queue.shift();
if(node.left){
queue.push(node.left);
}
if(node.right){
queue.push(node.right);
}
}
level ++;
}
return result;
}
复杂度分析
- 时间复杂度:每个点进队出队各一次,所以时间复杂度为O(n);
- 空间复杂度:队列中元素的个数不超过n个,空间复杂度是O(n)
二叉树的层次遍历 II
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)。例如:给定二叉树 [3,9,20,null,null,15,7],
返回其自底向上的层次遍历为:
对于二叉树进行层序遍历,最直接的方法就是BFS广度优先遍历
即:创建一个队列,将当前节点放进去,队列中的节点始终是当前层的节点,按顺序出列,加入结果中,并将当前节点的子节点加入到队列中。重复上述步骤,直到队列为空,就遍历完整个二叉树
let levelOrderBottom = function(root){
if(!root){
return []
}
let queue = [root]
const result = [] // 用来存储最后的结果
while(queue.length){
const subRes = [];
const levelSize = queue.length;
for(let i = 0;i<levelSize; i++){
let cur = queue.shift()
subRes.push(cur.val)
if(cur.left){
queue.push(cur.left)
}
if(cur.right){
queue.push(cur.right)
}
}
result.unshit(subRes)
}
return result
}
复杂度分析:
- 时间复杂度:O(n),其中 n 是二叉树中的节点数。每个节点访问一次,结果列表使用链表的结构时,在结果列表头部添加一层节点值的列表的时间复杂度是 O(1),因此总时间复杂度是 O(n)。
- 空间复杂度:O(n),其中 n 是二叉树中的节点数。空间复杂度取决于队列开销,队列中的节点个数不会超过 n。