当前位置: 首页 > article >正文

二叉树层序遍历的三种情况(总结)

这道题就是一个比较简单的层序遍历,只需要利用队列存放二叉树结点,队列的size代表每层的节点数也就是平均值的除数,利用一个结果数组记录每层平均值,最后返回。

需要注意的是,平均值定义成double类型。

代码如下:

class Solution {
    public List<Double> averageOfLevels(TreeNode root) {
        // 结果数组
        List<Double> results = new ArrayList<>();
        if (root == null) {
            return results;
        }

        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            // 当前层节点数量
            int LevelSize = queue.size();
            // 当前节点值的总和
            double levelSum = 0;
            // 遍历当前层所有节点
            for (int i = 0; i < LevelSize; i++) {
                // 从队列中取出一个节点
                TreeNode node = queue.poll();
                levelSum += node.val;
                if (node.left != null) {
                    queue.offer(node.left);
                }
                if (node.right != null) {
                    queue.offer(node.right);
                }

            }
            double average = levelSum / LevelSize;
            results.add(average);

        }
        return results;

    }
}

这道题其实就是简单的二叉树层序遍历,只不过把每层的节点遍历单独拿了出来,那么其实很简单。创建一个嵌套列表List<List<Integer>> res = new ArrayList<List<Integer>>(),每层的结果用一维列表存储,最后把每层结果存进嵌套列表输出即可。

代码如下:

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res=new ArrayList<List<Integer>>();
        if(root==null){
            return res;
        }
        Queue<TreeNode>queue=new LinkedList<TreeNode>();
        queue.offer(root);
        while(!queue.isEmpty()){
            List<Integer>level=new ArrayList<Integer>();
            int currentSize=queue.size();
            for(int i=1;i<=currentSize;++i){
                TreeNode node=queue.poll();
                level.add(node.val);
                if(node.left!=null){
                    queue.offer(node.left);
                }
                if(node.right!=null){
                    queue.offer(node.right);
                }
             
            }
               res.add(level);
        
        }
            return res;
        }

    }

这道题就用到了一种平常不怎么常用的数据结构,双端队列,利用一个bool 变量来表示该层是从左往后还是从右往左

  • 如果从左至右,我们每次将被遍历到的元素插入至双端队列的末尾。

  • 如果从右至左,我们每次将被遍历到的元素插入至双端队列的头部。

代码如下:
 

class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>>ans=new LinkedList<List<Integer>>();
        if(root==null){
            return ans;
        }
        Queue<TreeNode>nodequeue=new ArrayDeque<TreeNode>();//双端队列
        nodequeue.offer(root);
        boolean isOrderLeft=true;
        while(!nodequeue.isEmpty()){
            Deque<Integer> levelList=new LinkedList<Integer>();
            int size=nodequeue.size();
            for(int i=0;i<size;i++){
                TreeNode curNode=nodequeue.poll();
                if(isOrderLeft){
                    levelList.offerLast(curNode.val);
                }
                else{
                    levelList.offerFirst(curNode.val);
                }
                if(curNode.left!=null){
                    nodequeue.offer(curNode.left);
                }
                if(curNode.right!=null){
                    nodequeue.offer(curNode.right);
                }
            }
            ans.add(new LinkedList<Integer>(levelList));
            isOrderLeft=!isOrderLeft;
        }
        return ans;
    }
}


http://www.kler.cn/a/554593.html

相关文章:

  • 蓝桥杯备考:递归初阶
  • Vue.js Vue 测试工具:Vue Test Utils 与 Jest
  • 学习threejs,THREE.Material材质基类详解
  • 费曼学习法1 - 你好,PIL!图像处理的魔法棒 (入门篇)
  • 右键管家深度评测:打造个性化Windows右键菜单的高效工具
  • 论文略读:MoE-LLaVA:MixtureofExpertsforLargeVision-LanguageModels
  • requestAnimationFrame(rAF)使用,与传统方法(如 setTimeout/setInterval),直观展示 rAF 的优势
  • C++:使用 SFML 创建强化学习迷宫场景
  • 计算机网络-OSI七层参考模型与数据封装,网络安全零基础入门到精通实战教程!
  • Spring Boot +SQL项目优化策略,GraphQL和SQL 区别,Spring JDBC 等原理辨析(万字长文+代码)
  • Python与Anaconda在CUDA环境中的角色解析
  • github在同步本地与远程仓库时遇到的问题
  • 6121A 音频分析仪
  • 网络运维学习笔记 015网工初级(HCIA-Datacom与CCNA-EI)NAT网络地址转换
  • 使用Java爬虫获取1688自定义API操作接口
  • 【Axure 模版素材】数据可视化驾驶舱+图表素材 - AxureMost
  • CPU与GPU之区别(The Difference between CPU and GPU)
  • 使用Geotools读取DEM地形数据实战-以湖南省30米数据为例
  • 网络安全-openssl工具
  • DeepSeek 助力 Vue 开发:打造丝滑的复制到剪贴板(Copy to Clipboard)