首页 > 其他分享 >层序遍历

层序遍历

时间:2022-12-28 21:33:47浏览次数:31  
标签:遍历 队列 复杂度 层序 queue 二叉树 节点

二叉树的层次遍历

从左到右访问所有节点

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

[
  [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。

标签:遍历,队列,复杂度,层序,queue,二叉树,节点
From: https://www.cnblogs.com/yiyunh/p/17011325.html

相关文章

  • mysql 循环遍历结果集,来逐条更新
    SELECTUSER_IDFROMua;会返回USER_ID的列表  通过循环来逐条更新符合USER_ID的记录#delimiter$$告诉解释器使用$$结尾delimiter$$DROPPROCEDUREIFEXIST......
  • 马的遍历.
    题目描述​有一个n行m列的棋盘(1<n,m≤400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。输入​一行四个整数,分别表示棋盘大小n,m和马......
  • 无脑带你遍历用户生命价值与流失挽救(上) : 流量下的价值套路
    这是一篇讲述用户生命周期与流失挽救方面知识的文章,穿插了大量的从BI角度对业务进行数据分析的方法。相关知识的宽度与深度有点高,涉及到的知识点有:用户生命周期、流量方向的......
  • 无脑带你遍历用户生命价值与流失挽救(上) : 流量下的价值套路
    这是一篇讲述用户生命周期与流失挽救方面知识的文章,穿插了大量的从BI角度对业务进行数据分析的方法。相关知识的宽度与深度有点高,涉及到的知识点有:用户生命周期、流量方向的......
  • QT案例词典 -- 存储内容及遍历
    遗憾的是,两个人不能在一起,却偏偏相遇。。。---- 网易云热评一、字典内容就三个词a:第一个字母b:第二个字母C:第三个字母#defineMAX3 二、定义一个词的机构体structdict{......
  • 遍历dom节点
    functionselectOnchang(obj){varselectedValue=obj.selectedIndexif(selectedValue==0){obj.parentNode.nextSibl......
  • 学完层序,真的直接一口气,不用任何递归,搞定10道题
    102.二叉树的层序遍历classSolution{publicList<List<Integer>>levelOrder(TreeNoderoot){Queue<TreeNode>queue=newLinkedList<>();L......
  • 几种数组遍历
    for(vari=0;i<arr.length;i++)普通遍历for(vari=0;long=arr.length,i<long;i++),这是使用临时变量将数组长度缓存,当数组长度较大时,这种遍历跟普通遍历才会有些明......
  • BFS场景样例测试--层次遍历--用Java实现
    我们今天研究下层次便利用BFS来实现 首先确定数据结构/***二叉树数据结构节点*/publicclassTreeNode{intvalue;TreeNodeleft;TreeNoderi......
  • 有用的DOM遍历方法,你需要了解一下
    英文| https://levelup.gitconnected.com/useful-dom-traversal-methods-d2b55cf8e25c翻译|web前端开发(ID:web_qdkf)客户端JavaScript的主要用途是动态地处理网页。我们......