LeetCode题练习与总结:有序链表转换二叉搜索树--109

一、题目描述

给定一个单链表的头节点  head ,其中的元素 按升序排序 ,将其转换为平衡二叉搜索树。

示例 1:

输入: head = [-10,-3,0,5,9]
输出: [0,-3,9,-10,null,5]
解释: 一个可能的答案是[0,-3,9,-10,null,5],它表示所示的高度平衡的二叉搜索树。

示例 2:

输入: head = []
输出: []

提示:

  • head 中的节点数在[0, 2 * 10^4] 范围内
  • -10^5 <= Node.val <= 10^5

二、解题思路

为了将一个升序链表转换为平衡的二叉搜索树(BST),我们可以利用链表的特性以及BST的性质。由于链表是升序的,我们可以通过快慢指针的方法找到链表的中间节点,这个中间节点就可以作为BST的根节点。然后,我们可以递归地将链表的前半部分转换为根节点的左子树,将链表的后半部分转换为根节点的右子树。

具体步骤如下:

  1. 使用快慢指针找到链表的中间节点,慢指针所在的位置即为中间位置,快指针用于确定慢指针的位置。

  2. 将慢指针指向的节点作为当前子树的根节点。

  3. 将链表从中间节点断开,分成左右两部分。

  4. 递归地将左半部分链表转换为根节点的左子树,将右半部分链表转换为根节点的右子树。

  5. 返回根节点,完成构建。

三、具体代码

class Solution {public TreeNode sortedListToBST(ListNode head) {if (head == null) {return null;}// Step 1: Find the middle of the listListNode mid = findMiddle(head);// Step 2: The middle node will be the root of the BSTTreeNode root = new TreeNode(mid.val);// Base case when there is only one element in the listif (head == mid) {return root;}// Step 3: Recursively build the left and right subtreesroot.left = sortedListToBST(head);root.right = sortedListToBST(mid.next);return root;}// Helper function to find the middle of the listprivate ListNode findMiddle(ListNode head) {ListNode prevPtr = null;ListNode slowPtr = head;ListNode fastPtr = head;// Iterate until fastPr doesn't reach the end of the listwhile (fastPtr != null && fastPtr.next != null) {prevPtr = slowPtr;slowPtr = slowPtr.next;fastPtr = fastPtr.next.next;}// If the slow pointer is not the first node, disconnect it from the listif (prevPtr != null) {prevPtr.next = null;}return slowPtr;}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 查找中间节点:对于长度为 n 的链表,找到中间节点需要 O(n) 时间。
  • 递归构建左右子树:由于每次递归链表长度减半,所以递归的次数为 log(n)。
  • 每次递归中,除了递归调用本身,没有其他额外的操作。

综上所述,总的时间复杂度为 O(nlog(n))。

2. 空间复杂度
  • 递归栈空间:由于构建的是平衡二叉搜索树,递归的深度为 O(log(n)),因此递归栈的空间复杂度为 O(log(n))。
  • 辅助空间:除了递归栈之外,没有使用额外的空间。

综上所述,总的空间复杂度为 O(log(n))。

五、总结知识点

1. 链表操作

  • 遍历链表:使用while循环和指针遍历链表。
  • 快慢指针技巧:用于找到链表的中间节点,快指针每次移动两步,慢指针每次移动一步。

2. 递归

  • 递归是函数自己调用自己的过程,用于解决分而治之的问题,如这里的链表转换为二叉搜索树。

3. 二叉搜索树(BST)的性质

  • BST是一种特殊的二叉树,其中每个节点的左子树只包含小于当前节点的值,右子树只包含大于当前节点的值。

4. 平衡二叉树的构建

  • 通过选择链表的中间元素作为子树的根节点,可以保证构建出的二叉搜索树是平衡的。

5. 函数定义与调用

  • sortedListToBST 是主函数,负责启动递归过程。
  • findMiddle 是辅助函数,负责找到链表的中间节点并断开链表。

6. 指针和引用

  • 在Java中,虽然没有指针的概念,但是对象引用可以类比指针,用于操作对象。

7. 链表与树的转换

  • 将一个有序链表转换为平衡二叉搜索树,涉及到数据结构之间的转换。

8. 递归的终止条件

  • 当链表为空时,递归结束,返回null

9. 节点断开

  • 在找到中间节点后,需要将中间节点的前一个节点的next引用设置为null,从而断开链表。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

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

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

相关文章

OpenHarmony迎来首个互联网技术统一标准,鸿蒙OS生态走向如何?

开源三年半&#xff0c;OpenHarmony(以下简称“开源鸿蒙”)迎来了新进展。在5月25日召开的「OpenHarmony开发者大会」上&#xff0c;鸿蒙官宣了开源鸿蒙设备统一互联技术标准。 一直以来&#xff0c;各行业品牌操作系统相互独立、难以协同,成为其互联互通的痛点。为进一步解决…

3d火灾救援模拟仿真培训软件复用性强

消防VR安全逃生体验系统是深圳VR公司华锐视点引入了前沿的VR虚拟现实、web3d开发和多媒体交互技术&#xff0c;为用户打造了一个逼真的火灾现场应急逃生模拟演练环境。 相比传统的消防逃生模拟演练&#xff0c;消防VR安全逃生体验系统包含知识讲解和模拟实训演练&#xff0c;体…

前端自动将 HTTP 请求升级为 HTTPS 请求

前端将HTTP请求升级为HTTPS请求有两种方式&#xff1a; 一、index.html 中插入meta 直接在首页 index.html 的 head 中加入一条 meta 即可&#xff0c;如下所示&#xff1a; <meta http-equiv"Content-Security-Policy" content"upgrade-insecure-requests&…

Python图像处理库全面详细解析

目录 引言 PIL和Pillow&#xff1a;基础但强大的图像处理 PIL到Pillow的演变 功能亮点 实际应用案例 Pillow的适用场景 结论 ​编辑 OpenCV&#xff1a;计算机视觉的瑞士军刀 OpenCV的核心特点 功能亮点 实际应用案例 OpenCV的适用场景 结论 ​编辑 Scikit-Imag…

Linux echo命令(在终端输出文本)

文章目录 Linux Echo命令深度解析简介命令语法常见选项- -n&#xff1a;不输出行尾的换行符&#xff0c;这意味着输出后不会换到下一行。- -e&#xff1a;启用反斜杠转义的解释&#xff0c;允许使用特殊字符。- -E&#xff1a;禁用反斜杠转义的解释&#xff08;默认选项&#x…

【哈希】闭散列的线性探测和开散列的哈希桶解决哈希冲突(C++两种方法模拟实现哈希表)(1)

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; C进阶 &#x1f389;其它专栏&#xff1a; C初阶 | Linux | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解 哈希函数与哈希 之 闭散列的线性探测解决哈希冲突 的相关内容。 如…

【论文阅读】Rank-DETR(NIPS‘23)

paper:https://arxiv.org/abs/2310.08854 code:https://github.com/LeapLabTHU/Rank-DETR

conda 环境找不到 libnsl.so.1

安装prokka后运行报错 perl: error while loading shared libraries: libnsl.so.1: cannot open shared object file: No such file or directory 通过conda list 可以看到 有libsnl 2.00版本&#xff0c;通过修改软链接方式进行欺骗

ssm137基于SSM框架的微博系统+vue

微博系统网站的设计与实现 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就…

【已解决】C#设置Halcon显示区域Region的颜色

前言 在开发过程中&#xff0c;突然发现我需要显示的筛选区域的颜色是白色的&#xff0c;如下图示&#xff0c;这对我们来说不明显会导致我的二值化筛选的时候存在误差&#xff0c;因此我们需要更换成红色显示这样的话就可以更加的明显&#xff0c;二值化筛选更加的准确。 解…

arcgisPro精确移动要素某一点至指定点位

1、打开要素&#xff0c;如下&#xff1a; 2、选择移动工具&#xff0c;如下&#xff1a; 3、选择需要移动的要素&#xff0c;如下&#xff1a; 4、按住Ctrl键&#xff0c;移动锚点的位置至三角形顶点位置&#xff0c;如下&#xff1a; 5、拖动锚点至上面多边形的左上角点&…

线性稳压电路和开关稳压电路

稳压二极管稳压电路 电网电压增大&#xff0c;导到u1端的电压增大&#xff0c;从而使输出电压&#xff0c;稳压二极管两端的电压增大&#xff0c;稳压二极管两端电压增大&#xff0c;使流过的电注增大。那么&#xff0c;流过线性电阻R的总电流增大。 Ur电压增大&#xff0c;从…

软考结束。有什么要说的

1. 竟然是机试&#xff0c;出乎我意料。是 考试机构觉得笔试成本高了么。这次的考试是机试&#xff0c;相比以往有所不一样。感言是不是以后都会在固定地点考试也说不准。 2. 遇到年轻人。 这次旁边的一个女同学第一次参加&#xff0c;还像我询问了一些关于软考的事。我是有…

安卓开机启动阶段

目录 概述一、boot_progress_start二、boot_progress_preload_start三、boot_progress_preload_end四、boot_progress_system_run五、boot_progress_pms_start六、boot_progress_pms_system_scan_start七、boot_progress_pms_data_scan_start八、boot_progress_pms_scan_end九、…

家用洗地机哪个品牌好?家用洗地机排行榜前十名

随着洗地机逐渐进入大众视野&#xff0c;这种集吸、拖、洗功能于一体的清洁工具&#xff0c;凭借其高效便捷的特点&#xff0c;成为家庭清洁的新宠。洗地机不仅能够减少地面清洁时间&#xff0c;节省体力&#xff0c;还能提高清洁效果。然而&#xff0c;面对琳琅满目的洗地机品…

YOLOv10详细解读 | 一文带你深入了解yolov10的创新点(附网络结构图 + 举例说明)

前言 Hello大家好&#xff0c;我是Snu77&#xff0c;继YOLOv9发布时间没有多久&#xff0c;YOLOv10就紧接着发布于2024.5.23号&#xff08;不得不感叹YOLO系列的发展速度&#xff0c;但要纠正大家的观点就是不是最新的就一定最好&#xff09;&#xff01; 本文给大家带来的是…

体验SmartEDA的高效与便捷,电子设计从未如此简单

SmartEDA&#xff1a;革新电子设计&#xff0c;让高效与便捷触手可及 在快节奏的现代生活中&#xff0c;科技日新月异&#xff0c;各行各业都在寻求更高效、更便捷的解决方案。对于电子设计行业而言&#xff0c;SmartEDA的出现&#xff0c;无疑是一场革命性的变革。它以其高效…

【ARM+Codesys案例】T3/RK3568/树莓派+Codesys枕式包装机运动控制器

枕式包装机是一种包装能力非常强&#xff0c;且能适合多种规格用于食品和非食品包装的连续式包装机。它不但能用于无商标包装材料的包装&#xff0c;而且能够使用预先印有商标图案的卷筒材料进行高速包装。同时&#xff0c;具有稳定性高、生产效率高&#xff0c;适合连续包装、…

电子围栏(地理围栏)设计逻辑

做完整的项目时需要考虑安全问题&#xff0c;判断车辆在不该出现的位置出现时自动刹车。 只能说可以有吧。 地理围栏的概念 自动驾驶地理围栏是指在自动驾驶系统中定义的一种虚拟边界&#xff0c;用于限制车辆的运行范围。地理围栏可以通过全球定位系统&#xff08;GPS&#…

如何将红酒配餐融入日常生活

红酒配餐不仅可以提升用餐的品质&#xff0c;还可以为日常生活增添一份优雅和情调。云仓酒庄雷盛红酒以其卓着的品质和丰富的口感&#xff0c;成为了实现红酒配餐融入日常生活的理想选择。下面将介绍如何将雷盛红酒配餐融入日常生活。 首先&#xff0c;了解红酒的基本知识。了解…