102. 二叉树的层序遍历

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public List<List<Integer>> levelOrder(TreeNode root) {// 创建结果列表,用于存储每层的节点值List<List<Integer>> ret = new ArrayList<List<Integer>>();// 处理空树情况if (root == null) {return ret;}// 创建队列用于BFS遍历,初始时加入根节点Queue<TreeNode> queue = new LinkedList<TreeNode>();queue.offer(root);  // 将根节点加入队列// 开始BFS遍历while (!queue.isEmpty()) {// 创建当前层的节点值列表List<Integer> level = new ArrayList<Integer>();// 记录当前层的节点数量int currentLevelSize = queue.size();// 遍历当前层的所有节点for (int i = 1; i <= currentLevelSize; ++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);}}// 将当前层的节点值列表加入结果列表ret.add(level);}// 返回层序遍历结果return ret;}
}

关键点说明

  1. BFS(广度优先搜索)算法

    • 使用队列数据结构实现

    • 从根节点开始,按层级依次遍历

  2. 层序遍历的特点

    • 每层节点单独存储在一个子列表中

    • 结果是一个二维列表,每个子列表代表一层的节点值

  3. 队列的使用

    • offer()方法用于将元素加入队列尾部

    • poll()方法用于从队列头部取出元素

  4. 时间复杂度

    • O(n):每个节点被访问一次

    • n为二叉树中的节点总数

  5. 空间复杂度

    • O(n):最坏情况下队列需要存储所有叶子节点

示例执行流程

对于如下二叉树:

text

    3/ \9  20/  \15   7

执行过程:

  1. 初始队列:[3]

    • 处理3,加入子列表[3]

    • 加入子节点9,20 → 队列:[9,20]

  2. 处理队列:[9,20]

    • 处理9 → 子列表[9](无子节点)

    • 处理20 → 子列表[9,20]

    • 加入子节点15,7 → 队列:[15,7]

  3. 处理队列:[15,7]

    • 处理15 → 子列表[15](无子节点)

    • 处理7 → 子列表[15,7](无子节点)

  4. 最终结果:[[3], [9,20], [15,7]]

108. 将有序数组转换为二叉搜索树

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public TreeNode sortedArrayToBST(int[] nums) {return helper(nums, 0, nums.length - 1);}public TreeNode helper(int[] nums,int left, int right){if(left>right){return null;}int tip=(left+right)/2;TreeNode root = new TreeNode(nums[tip]);root.left=helper(nums, left, tip-1);root.right=helper(nums,tip+1,right);return root;}
}

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    /**
     * 将有序数组转换为高度平衡的二叉搜索树
     * @param nums 有序整数数组
     * @return 二叉搜索树的根节点
     */
    public TreeNode sortedArrayToBST(int[] nums) {
        // 调用辅助函数,传入数组和初始边界
        return helper(nums, 0, nums.length - 1);
    }
    
    /**
     * 递归辅助函数,构建BST
     * @param nums 有序数组
     * @param left 当前子数组的左边界
     * @param right 当前子数组的右边界
     * @return 构建好的子树根节点
     */
    public TreeNode helper(int[] nums, int left, int right) {
        // 递归终止条件:左边界超过右边界
        if (left > right) {
            return null;
        }
        
        // 选择中间位置作为当前子树的根节点
        // 这样能保证树的高度平衡
        int mid = (left + right) / 2;
        
        // 创建当前根节点
        TreeNode root = new TreeNode(nums[mid]);
        
        // 递归构建左子树(使用左半部分数组)
        root.left = helper(nums, left, mid - 1);
        
        // 递归构建右子树(使用右半部分数组)
        root.right = helper(nums, mid + 1, right);
        
        return root;
    }
}

关键点说明

  1. 高度平衡BST的定义

    • 每个节点的左右子树高度差不超过1

    • 通过总是选择中间元素作为根节点来保证平衡性

  2. 分治算法思想

    • 将问题分解为更小的子问题(左子树和右子树)

    • 合并子问题的解(构建当前树)

  3. 时间复杂度

    • O(n):每个元素只被访问一次

    • n为数组长度

  4. 空间复杂度

    • O(log n):递归栈的深度

    • 对于平衡BST,树的高度为log n

  5. 中间位置选择

    • mid = (left + right) / 2 对于偶数长度数组,可以选择中间偏左或偏右

    • 这里选择的是偏左的位置(因为整数除法会截断小数)

示例执行流程

对于输入数组:[-10, -3, 0, 5, 9]

构建过程:

  1. 初始调用:helper(nums, 0, 4)

    • mid=2 → root=0

    • 左子树:helper(nums, 0, 1)

      • mid=0 → root=-10

      • 左子树:helper(nums, 0, -1) → null

      • 右子树:helper(nums, 1, 1)

        • mid=1 → root=-3

        • 左右子树均为null

    • 右子树:helper(nums, 3, 4)

      • mid=3 → root=5

      • 左子树:helper(nums, 3, 2) → null

      • 右子树:helper(nums, 4, 4)

        • mid=4 → root=9

        • 左右子树均为null

最终BST结构:

text

      0/ \-10  5\   \-3   9

算法变体

  1. 选择中间偏右的位置

    java

    int mid = (left + right + 1) / 2;

    对于偶数长度数组会选择中间偏右的元素

  2. 迭代实现
    可以使用栈来模拟递归过程,避免递归调用

  3. 处理大数据集
    对于非常大的数组,可以考虑将数组分段处理

这种实现方式充分利用了有序数组和二叉搜索树的特性,通过分治策略高效地构建出平衡的二叉搜索树。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/95382.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95382.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/95382.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开疆智能Ethernet转ModbusTCP网关连接发那科机器人与三菱PLC配置案例

本案例是三菱FX5U PLC通过ethernet/IP转ModbusTCP网关对发那科机器人进行控制的配置案例。PLC端主要配置以太网端口设置在通信测试中&#xff0c;PLC作为主站&#xff0c;在PLC设置中选择“以太网端口”非常关键&#xff0c;以确保通信测试的正常进行。1、首先&#xff0c;在PL…

VUE+SPRINGBOOT从0-1打造前后端-前后台系统-系统首页

在现代Web应用开发中&#xff0c;管理后台是几乎所有企业级应用不可或缺的部分。一个优秀的后台首页不仅需要提供清晰的信息展示&#xff0c;还需要具备良好的用户体验和视觉效果。本文将详细介绍如何使用Vue.js框架配合Element UI组件库和ECharts图表库&#xff0c;构建一个功…

第6节 torch.nn介绍

6.1 torch.nn.Module介绍 torch.nn.Module是 PyTorch 中构建神经网络的基础类&#xff0c;所有的神经网络模块都应该继承这个类。它提供了一种便捷的方式来组织和管理网络中的各个组件&#xff0c;包括层、参数等&#xff0c;同时还内置了许多用于模型训练和推理的功能。 官网…

python自学笔记7 可视化初步

图像的组成工具库 Matplotlib&#xff1a;绘制静态图 Plotly: 可以绘制交互式图片 图像的绘制&#xff08;Matplotlib&#xff09; 创建图形&#xff0c;轴对象 创造等差数列 # 包含后端点 arr np.linspace(0, 1, num11) # 不包含后端点 arr_no_endpoint np.linspace(0, 1, n…

GIS 常用的矢量与栅格分析工具

矢量处理工具作用典型应用缓冲区分析Buffer环境影响区域&#xff0c;空间邻近度分析等&#xff0c;例如道路周围一公里内的学校&#xff0c;噪音污染影响的范围裁剪Clip例如使用A市图层裁剪全国道路数据&#xff0c;获取A市道路数据交集Intersect识别与LUCC、分区洪水区、基础设…

http与https协议区别;vue3本地连接https地址接口报500

文章目录问题解决方案一、问题原因分析二、解决方案详解1. 保持当前配置&#xff08;推荐临时方案&#xff09;2. 更安全的方案&#xff08;推荐&#xff09;3. 环境区分配置&#xff08;最佳实践&#xff09;三、为什么开发环境不用配置&#xff1f;问题 问题&#xff1a;本地…

C语言——深入理解指针(三)

C语言——深入理解指针&#xff08;三&#xff09; 1.回调函数是什么&#xff1f; 首先我们来回顾一下函数的直接调用&#xff1a;而回调函数就是通过函数指针调用的函数。我们将函数的指针&#xff08;地址&#xff09;作为参数传递给另一个函数&#xff0c;当这个指针被用来调…

kettle 8.2 ETL项目【四、加载数据】

一、dim_store表结构,数据来源于业务表,且随时间会有增加,属于缓慢变化维(SCD)类型二 转换步骤如下 详细步骤如下

【测试报告】SoundWave(Java+Selenium+Jmeter自动化测试)

一、项目背景 随着数字音乐内容的爆炸式增长&#xff0c;用户对于便捷、高效的音乐管理与播放需求日益增强。传统的本地音乐管理方式已无法满足多设备同步、在线分享与个性化推荐等现代需求。为此&#xff0c;我们设计并开发了一款基于Spring Boot框架的SoundWave&#xff0c;旨…

C++ 类和对象详解(1)

类和对象是 C 面向对象编程的核心概念&#xff0c;它们为代码提供了更好的封装性、可读性和可维护性。本文将从类的定义开始&#xff0c;逐步讲解访问限定符、类域、实例化、对象大小计算、this 指针等关键知识&#xff0c;并对比 C 语言与 C 在实现数据结构时的差异&#xff0…

奈飞工厂:算法优化实战

推荐系统的算法逻辑与优化技巧在流媒体行业的 “用户注意力争夺战” 中&#xff0c;推荐系统是决定成败的核心武器。对于拥有2.3 亿全球付费用户的奈飞&#xff08;Netflix&#xff09;而言&#xff0c;其推荐系统每天处理数十亿次用户交互&#xff0c;最终实现了一个惊人数据&…

【人工智能99问】BERT的训练过程和推理过程是怎么样的?(24/99)

文章目录BERT的训练过程与推理过程一、预训练过程&#xff1a;学习通用语言表示1. 数据准备2. MLM任务训练&#xff08;核心&#xff09;3. NSP任务训练4. 预训练优化二、微调过程&#xff1a;适配下游任务1. 任务定义与数据2. 输入处理3. 模型结构调整4. 微调训练三、推理过程…

[TryHackMe]Challenges---Game Zone游戏区

这个房间将涵盖 SQLi&#xff08;手动利用此漏洞和通过 SQLMap&#xff09;&#xff0c;破解用户的哈希密码&#xff0c;使用 SSH 隧道揭示隐藏服务&#xff0c;以及使用 metasploit payload 获取 root 权限。 1.通过SQL注入获得访问权限 手工注入 输入用户名 尝试使用SQL注入…

北京JAVA基础面试30天打卡09

1.MySQL存储引擎及区别特性MyISAMMemoryInnoDBB 树索引✅ Yes✅ Yes✅ Yes备份 / 按时间点恢复✅ Yes✅ Yes✅ Yes集群数据库支持❌ No❌ No❌ No聚簇索引❌ No❌ No✅ Yes压缩数据✅ Yes❌ No✅ Yes数据缓存❌ NoN/A✅ Yes加密数据✅ Yes✅ Yes✅ Yes外键支持❌ No❌ No✅ Yes…

AI时代的SD-WAN异地组网如何落地?

在全球化运营与数字化转型浪潮下&#xff0c;企业分支机构、数据中心与云服务的跨地域互联需求激增。传统专线因成本高昂、部署缓慢、灵活性差等问题日益凸显不足。SD-WAN以其智能化调度、显著降本、敏捷部署和云网融合的核心优势&#xff0c;成为实现高效、可靠、安全异地组网…

css中的color-mix()函数

color-mix() 是 CSS 颜色模块&#xff08;CSS Color Module Level 5&#xff09;中引入的一个强大的颜色混合函数&#xff0c;用于在指定的颜色空间中混合两种或多种颜色&#xff0c;生成新的颜色值。它解决了传统颜色混合&#xff08;如通过透明度叠加&#xff09;在视觉一致性…

Github desktop介绍(GitHub官方推出的一款图形化桌面工具,旨在简化Git和GitHub的使用流程)

文章目录**1. 简化 Git 操作****2. 代码版本控制****3. 团队协作****4. 代码托管与共享****5. 集成与扩展****6. 跨平台支持****7. 适合的使用场景****总结**GitHub Desktop 是 GitHub 官方推出的一款图形化桌面工具&#xff0c;旨在简化 Git 和 GitHub 的使用流程&#xff0c;…

整数规划-分支定界

内容来自:b站数学建模老哥 如:3.4,先找小于3的,再找大于4的 逐个

JetPack系列教程(六):Paging——让分页加载不再“秃”然

前言 在Android开发的世界里&#xff0c;分页加载就像是一场永无止境的马拉松&#xff0c;每次滚动到底部&#xff0c;都仿佛在提醒你&#xff1a;“嘿&#xff0c;朋友&#xff0c;还有更多数据等着你呢&#xff01;”但别担心&#xff0c;Google大佬们早就看透了我们的烦恼&a…

扎实基础!深入理解Spring框架,解锁Java开发新境界

大家好&#xff0c;今天想和大家聊聊Java开发路上绕不开的一个重要基石——Spring框架。很多朋友在接触SpringBoot、SpringCloud这些现代化开发工具时&#xff0c;常常会感到吃力。究其原因&#xff0c;往往是对其底层的Spring核心机制理解不够透彻。Spring是构建这些高效框架的…