一次字节面试,被二叉树的层序遍历捏爆了(代码片段)

Bigsai Bigsai     2023-01-03     446

关键词:

前言

大家好,我是bigsai,在数据结构与算法中,二叉树无论是考研、笔试都是非常高频的考点内容,在二叉树中,二叉树的遍历又是非常重要的知识点,今天给大家讲讲二叉树的层序遍历。

这部分很多人可能会但是需要注重一下细节。

前面介绍了二叉排序树的构造和基本方法的实现,遍历也是比较重要的一环,并且二叉树的层序遍历也是bfs的最简单情况,这里我就将二叉树的层序遍历以及常考问题给大家分享一下。

在了解二叉树的遍历之前,需要具备数据结构与算法有队列、递归、栈、二叉树,这些内容咱们前面都有讲过,有这方面知识欠缺的同学可以往前翻一翻看一看!

层序遍历

层序遍历,听名字也知道是按层遍历。一个节点有左右节点,按层处理就是当前层兄弟节点的优先级要大于子节点处理的优先级,所以就是要将子节点放到后面处理,这就适合队列这个数据结构用来存储。

对于队列,先进先出。从root节点push到队列,那么队列中先出来的顺序是第二层的左右(假设都有),第二层每个节点执行的时候按照左右顺序添加到队列,第三层的节点就会有序的放到最后面……按照这样的规则就能得到一个层序遍历的顺序。

实现的代码也很容易理解:

public int[] levelOrder(TreeNode root) 
        int arr[]=new int[10000];
        int index=0;
        Queue<TreeNode>queue=new ArrayDeque<>();
        if(root!=null)
            queue.add(root);
        while (!queue.isEmpty())
            TreeNode node=queue.poll();
            arr[index++]= node.val;
            if(node.left!=null)
                queue.add(node.left);
            if(node.right!=null)
                queue.add(node.right);
            
        
        return Arrays.copyOf(arr,index);
    

分层存储

但是在具体笔试他可能要求你分层存储,例如力扣的102二叉树的层序遍历,要求返回一个List<List<Integer>>类型。

这种相比上面一个多了一层逻辑就是每一层数据放到一块,这个也很容易,最好想到的就是两个队列(容器)一层一层遍历存储,然后交替,但是两个队列(容器)的写法常常会被面试官嫌弃,很多面试官让你想想怎么不用两个容器实现?

不用双队列去枚举结果也很容易,重要的就是先记录队列大小size(当前层节点数量),然后执行size次数的枚举即可,具体代码为:

public List<List<Integer>> levelOrder(TreeNode root) 
  List<List<Integer>>list=new ArrayList<List<Integer>>();
  if(root==null)return list;
  Queue<TreeNode>q1=new ArrayDeque<TreeNode>();
  q1.add(root);
  while (!q1.isEmpty()) 
    int size=q1.size();
    List<Integer>value=new ArrayList<Integer>();
    for(int i=0;i<size;i++)
    
      TreeNode pNode=q1.poll();
      if(pNode.left!=null)
        q1.add(pNode.left);
      if(pNode.right!=null)
        q1.add(pNode.right);
      value.add(pNode.val);
    
    list.add(value);
  
  return list;

之字形打印

除了这个直接层序遍历,二叉树还有很高频的就是之字形遍历,例如剑指offer32和力扣103 二叉树的锯齿形层序遍历,它的题目要求为:

请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。

这道题虽然不是难题,但是有点绕,本来队列这玩意我们就要大脑想一下什么顺序,又出来一个之字形,属实增加的思维逻辑,有不少小伙伴反映当时面试官让手撕这道题,自己以前明明写过,但是太紧张自己给自己绕进去了!

其实这个问题也很容易转化,因为值只是存储,我们按照老样子去进行层序遍历,只不过在遍历时候通过当前层奇偶数来给它判断是从左往右存储到结果中还是从右往左放到结果中。当然,判断奇数偶数也很容易,可以用变量,也可以用结果List的size()都可。

个人实现的一个朴素代码为:

public List<List<Integer>> levelOrder(TreeNode root) 
  List<List<Integer>> value=new ArrayList<>();//存储到的最终结果
  if(root==null)
    return value;
  int index=0;//判断
  Queue<TreeNode>queue=new ArrayDeque<>();
  queue.add(root);
  while (!queue.isEmpty())
    List<Integer>va=new ArrayList<>();//临时 用于存储到value中
    int len=queue.size();//当前层的数量
    for(int i=0;i<len;i++)
      TreeNode node=queue.poll();
      if(index%2==0)
        va.add(node.val);
      else
        va.add(0,node.val);
      if(node.left!=null)
        queue.add(node.left);
      if(node.right!=null)
        queue.add(node.right);
    
    value.add(va);
    index++;
  
  return value;

上面实现代码也仅使用一个队列,不过这个问题可能有很多更巧妙的解法需要大家自己去挖掘。

结语

二叉树的层序遍历是二叉树内容中较为简单的内容,但是层序遍历尤其是之字形遍历(锯齿形遍历)出现的频率真的太高了,并且最好是掌握比较好的方法不要显得太臃肿。

不过在实际遇到问题时候,能AC是第一位,然后才是精简的逻辑和骚气的代码。

二叉树层序遍历变种问题不多,掌握上面三个问题基本就够了,而二叉树的前序、中序、后序遍历(递归非递归)考察非常多,后面会给大家加快梳理总结,敬请期待!

如果文章对你有帮助,欢迎关注我↓,回复【666】免费获得我自己的原创pdf! 咱们下次再见!

字节一次面试,被二叉树的层序遍历捏爆了!(代码片段)

👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇作者丨bigsai来源丨bigsai前言大家好,我是bigsai。在数据结构与算法中,二叉树无论是考研、笔试都是非常高频的考点内容,在二叉树中࿰... 查看详情

107.二叉树的层序遍历ii(代码片段)

...一个len记录每一层的数量同一层的遍历通过for来进行,每一次的遍历都判断此节点是否还有子节点,如果有则加入到队列中因为len记录了同一层的个数,所以每一次的遍历,即使上一层的节点和下一层的节点同时存在,也不会影响 查看详情

leetcode二叉树的层序遍历(代码片段)

二叉树的层序遍历题目描述题目分析二叉树的层序遍历代码实现总结题目描述题目分析xxxx这道题,题目是“二叉树的层序遍历”,首先我们提取一下题目和题目内容的关键词。“二叉树”、“层序遍历”、“每一层值分... 查看详情

leetcode二叉树的层序遍历(代码片段)

二叉树的层序遍历题目描述题目分析二叉树的层序遍历代码实现总结题目描述题目分析xxxx这道题,题目是“二叉树的层序遍历”,首先我们提取一下题目和题目内容的关键词。“二叉树”、“层序遍历”、“每一层值分... 查看详情

二叉树的层序遍历(代码片段)

107.二叉树的层序遍历II给定一个二叉树,返回其节点值自底向上的层序遍历。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)例如:给定二叉树[3,9,20,null,null,15,7],​3​ /\\920​/\\157返回其自底... 查看详情

nc15二叉树的层序遍历(代码片段)

题目描述二叉树的层序遍历解题思路运用二叉树的层序遍历和二叉树的深度计算的思想;代码展示/***structTreeNode* intval;* structTreeNode*left;* structTreeNode*right;*;*/classSolutionpublic:/****@paramrootTreeNode类*@returnint整型vector 查看详情

面试---算法面试(代码片段)

算法二叉树二叉树的遍历(前序、中序、后序、层序)递归版本非递归版本二叉树的常见oj二叉树的右视图N叉树的层序遍历反转二叉树对称二叉树子树问题二叉树的最近祖先问题二叉树的最大高度问题二叉树的最小深度完全二叉树... 查看详情

java二叉树的层序遍历(代码片段)

查看详情

102.二叉树的层序遍历(代码片段)

二叉树的层序遍历给你一个二叉树,请你返回其按层序遍历得到的节点值。(即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7]3/920/157返回其层序遍历结果:[[3],[9,20],[15,7]]/***Defini... 查看详情

102.二叉树的层序遍历(代码片段)

/***Definitionforabinarytreenode.*structTreeNode*intval;*structTreeNode*left;*structTreeNode*right;*;*//***Returnanarrayofarraysofsize*returnSize.*Thesizesofthearraysarereturnedas*returnColumnSizesa 查看详情

二叉树的层序遍历(代码片段)

题目描述:给你一个二叉树,请你返回其按层序遍历得到的节点值。(即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7],3/920/157返回其层次遍历结果:[[3],[9,20],[15,7]]  解题思路:首先我们要知道层序遍... 查看详情

刷题-力扣-102.二叉树的层序遍历(代码片段)

102.二叉树的层序遍历题目链接来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal/著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。题目描述给你一个二叉树,请你返回其... 查看详情

c++--二叉树的层序遍历(代码片段)

二叉树的层序遍历题目要求:题目来源:力扣classSolutionpublic:vector<vector<int>>levelOrder(TreeNode*root)if(root==nullptr)returnvector<vector<int>>();queue<TreeNode*> 查看详情

#yyds干货盘点#面试必刷top101:求二叉树的层序遍历

1.简述:描述给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)例如:给定的二叉树是3,9,20,#,#,15,7,该二叉树层序遍历的结果是[[3],[9,20],[15,7]]数据范围:二叉树的节点数满足 示例1输入:1,2返回... 查看详情

2021-4-9天梯赛补题(完全二叉树的层序遍历)(代码片段)

完全二叉树的层序遍历题目链接:link.原题描述一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树。对于深度为D的,有N个结点的二叉树,若其结点对应于相同深度完美二叉树的层序... 查看详情

二叉树的层序遍历--结合递归算法(代码片段)

...;intrear=0;intLevelOrderTraverse(BiTreeT)if(!isTreeExits)cout<<"二叉树不存在"; 查看详情

102#二叉树的层序遍历(代码片段)

题目描述给定一个二叉树,返回其按层次遍历的节点值。(即逐层地,从左到右访问所有节点)。例如:给定二叉树:[3,9,20,null,null,15,7],3/920/157返回其层次遍历结果:[[3],[9,20],[15,7]]分析思路常规思维法我们理一遍题意:给定一棵二... 查看详情

leetcode107.二叉树的层序遍历ii(代码片段)

给定一个二叉树,返回其节点值自底向上的层序遍历。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)例如:给定二叉树[3,9,20,null,null,15,7],3/\\920/\\157返回其自底向上的层序遍历为:[[15,7],... 查看详情