千家信息网

Java中二叉树层序遍历详细讲解

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,这篇文章主要讲解了"Java中二叉树层序遍历详细讲解",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java中二叉树层序遍历详细讲解"吧!层序遍历层序遍
千家信息网最后更新 2025年02月01日Java中二叉树层序遍历详细讲解

这篇文章主要讲解了"Java中二叉树层序遍历详细讲解",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java中二叉树层序遍历详细讲解"吧!

层序遍历

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

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

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

public int[] levelOrder(TreeNode root) {        int arr[]=new int[10000];        int index=0;        Queuequeue=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>类型。

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

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

public List> levelOrder(TreeNode root) {  List>list=new ArrayList>();  if(root==null)return list;  Queueq1=new ArrayDeque();  q1.add(root);  while (!q1.isEmpty()) {    int size=q1.size();    Listvalue=new ArrayList();    for(int i=0;i

之字形打印

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

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

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

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

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

public List> levelOrder(TreeNode root) {  List> value=new ArrayList<>();//存储到的最终结果  if(root==null)    return value;  int index=0;//判断  Queuequeue=new ArrayDeque<>();  queue.add(root);  while (!queue.isEmpty()){    Listva=new ArrayList<>();//临时 用于存储到value中    int len=queue.size();//当前层的数量    for(int i=0;i

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

感谢各位的阅读,以上就是"Java中二叉树层序遍历详细讲解"的内容了,经过本文的学习后,相信大家对Java中二叉树层序遍历详细讲解这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

队列 节点 顺序 存储 就是 结果 代码 字形 两个 二层 容器 问题 处理 学习 不用 优先级 内容 数据 数量 时候 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 用友财务软件的数据库中文正式版 tcm数据库 linux服务器文件管理 英雄联盟的服务器有什么用 程序连接不上sql数据库 和平精英可以刷新服务器吗 金东区条码软件开发 山东科技计算机网络技术代码 华品博睿网络技术广西 广东中人信息网络技术有限公司 姜堰区环保网络技术大概费用 济南市软件开发公司招聘信息 网络意识形态及网络安全责任制 事业单位网络安全管理员上升路径 小学网络安全及信息安全 山西大型软件开发销售公司 华为 单板软件开发部 数据库的查询分析器打开 aix数据库建连很慢 学前班网络安全教育 有哪些先进软件开发技术 网络安全鼓励学生学习的语言 ftp服务器破解版 虹口区管理软件开发咨询报价 程序连接不上sql数据库 江苏联通软件开发面试题 网络安全小学生视频 服务器为什么不能打开 不能删改的数据库 hp服务器系统安装
0