层序遍历

二叉树的层次遍历

从左到右访问所有节点

逐层地,从左到右访问所有节点,返回其层次遍历结果:

[
  [3],
  [9,20],
  [15,7]
]

实现思路:
创建一个数组存放结果,一个队列存放二叉树的节点,根据输出的要求,设置一个level, 存储当前层数,如果存放二叉树的队列不为空,就重复下面的操作

  1. 将队列的第一个节点作为根节点,并放入当前层的结果数组中
  2. 如果该节点的左子树不为空,将其放入队列中
  3. 如果该根节点的右子树不为空,就将其放入队列中
  4. 遍历完该层之后,就遍历下一层
/**
 * 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。
posted @ 2022-12-28 21:20  yiyunh  阅读(434)  评论(0)    收藏  举报