Leetcode 109.有序链表转换二叉搜索树(Medium)

news2024/11/23 21:45:34

给定一个单链表的头节点  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 * 104] 范围内
  • -105 <= Node.val <= 10

思路:先获取到链表的长度,然后去递归构造树即可,每次构造的树节点永远是链表或子链表的中心,但是由于是单向链表,所以每次获取链表中的节点的时候就会导致每次都从头开始,可以用循环链表改善,如果要构造的节点的坐标大于length/2的时候就next length -index次,然后递归构造,设置临界条件即可,若length为0就是无节点,如果length为1就是叶子节点。然后上代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
/**
 * 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 {
    ListNode temp;
    public TreeNode sortedListToBST(ListNode head) {
        temp = head;
        // 思路就是取链表的中心节点,作为总树或子树的根节点,然后循环、递归
        int length = getListLength(head);
        return buildTree(0, length);
        
    }
    
    
    public TreeNode buildTree(int start ,int length) {
        int i = 0;
        ListNode t = temp;
        while (i < start + length/2) {
            t = t.next;
            i++;
        }
        
        // 如果是0,直接为null
        if (length == 0) return null;
        
        // 如果length为1的时候,直接返回,因为它已经是树叶节点了
        if (length == 1) return new TreeNode(t.val, null, null);
        
        // 遍历到中心节点,就构造节点
        return new TreeNode(t.val, buildTree(start, length/2), buildTree(start + length/2 +1, length-1-length/2));
        
    }
    

    // 获取节点总节点数
    public int getListLength(ListNode head) {
        int length = 0;
        while(head != null) {
            length++;
            head = head.next;
        }
        return length;
    }
    
}

快慢指针也是解决中间值问题的一个快速的解决办法,思路相同,只是取中间值的方法不同。

class Solution {
    public TreeNode sortedListToBST(ListNode head) {
        return buildTree(head, null);
    }

    public TreeNode buildTree(ListNode left, ListNode right) {
        if (left == right) {
            return null;
        }
        ListNode mid = getMedian(left, right);
        TreeNode root = new TreeNode(mid.val);
        root.left = buildTree(left, mid);
        root.right = buildTree(mid.next, right);
        return root;
    }

    public ListNode getMedian(ListNode left, ListNode right) {
        ListNode fast = left;
        ListNode slow = left;
        while (fast != right && fast.next != right) {
            fast = fast.next;
            fast = fast.next;
            slow = slow.next;
        }
        return slow;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uni如何安装新依赖

如何在 uniapp 项目中&#xff0c;使用“插件市场” 的原生插件 插件市场 :DCloud 插件市场 1. 第一步&#xff1a; 首先在HBuilder x 中新建一个uniapp 项目&#xff0c;如果已建好 uniapp 项目则跳过该步骤。 2.第二步&#xff1a; 在 ”插件市场中 “ 选择你需要的原生插件…

微服务实战系列之玩转Docker(十四)

前言 时逢白露天骤变&#xff0c;细雨纷纷气渐凉&#xff0c;忽有故人心上过&#xff0c;回首山河已是秋。——碎碎念 当秋天来临的那一刻&#xff0c;你会想起故人么&#xff1f;此刻&#xff0c;突然一句唐诗——“故人具鸡黍&#xff0c;邀我去田家”&#xff0c;飘过了耳边…

CAN通信入门 - 1

CAN通信入门 - 1 CAN通信原理 参考链接&#xff1a;CAN总线原理 CAN总线信号为差分信号&#xff0c;其有2根总线分别为CAN-L\CAN-H。 CAN总线之间的电平分为显性电平和隐性电平&#xff0c;其中显性电平对应的是逻辑0&#xff0c;隐性电平对应的是逻辑1。当CAN差分信号为0V时…

【Web】骨架屏

文章目录 概述骨架屏的实现方案page-skeleton-webpack-plugin安装基本使用 来源 概述 骨架屏&#xff08;Skeleton Screen&#xff09;是一种在页面数据加载完成前&#xff0c;先给用户展示出页面的大致结构&#xff08;灰色占位图&#xff09;的技术。当页面实际数据加载并渲…

【话费充值】话费API接口对接有哪些关键步骤

话费API接口对接通常包括以下几个关键步骤&#xff1a; 选择服务提供商&#xff1a;选择一个可靠的话费充值API服务提供商&#xff0c;这可能是电信运营商本身或是一个信誉良好的第三方服务提供商。注册和认证&#xff1a;在选定的服务提供商平台上注册&#xff0c;并获得API访…

自研商家如何快速接入电商平台订单数据?

随着电子商务行业的快速发展&#xff0c;越来越多的商家开始寻求高效的订单管理和数据整合方案。对于那些自研系统的商家来说&#xff0c;如何实现与各大电商平台之间的无缝对接&#xff0c;成为了一项重要挑战。点三电商API正是为此类需求量身打造&#xff0c;为商家提供了一站…

【动态规划】任务调度dp 自用

kkksc03考前临时抱佛脚 原题 题目背景 kkksc03 的大学生活非常的颓废&#xff0c;平时根本不学习。但是&#xff0c;临近期末考试&#xff0c;他必须要开始抱佛脚&#xff0c;以求不挂科。 题目描述 这次期末考试&#xff0c;kkksc03 需要考 4 4 4 科。因此要开始刷习题集…

晶体晶格热导率的快速可解公式

https://doi.org/10.1016/j.mtphys.2024.101549 晶格热导率(κL)是晶体的一项重要物理性质&#xff0c;在热管理中具有广泛的应用&#xff0c;如散热、绝缘和热电能量转换。 然而&#xff0c;准确、快速地测定κL带来了相当大的挑战。 在这项研究中&#xff0c;引入了一个公式…

计算、谋算(算计)与逻辑

谋算的“逻辑”和计算的逻辑既相似又有区别。 谋算的逻辑通常涉及到策略、计划和决策的制定。它关注的是如何在不确定的情况下&#xff0c;通过分析和推理来达到目标。谋算者会考虑各种可能性&#xff08;01&#xff09;、风险&#xff08;0&#xff09;和利益&#xff08;1&am…

【鸿蒙应用开发】常见的容器组件:ColumnSplit、RowSplit和Flex

上一章已经了解了Column和Row的一些属性&#xff0c;以下是几个案例&#xff1a; 设置子组件水平方向的间距为&#xff1a;5 Entry Preview Component struct Index {State message: string Hello 鸿蒙;controller: webview.WebviewController new webview.WebviewControll…

【Java】Runtime与Properties获取系统信息

Java系列文章目录 补充内容 Windows通过SSH连接Linux 第一章 Linux基本命令的学习与Linux历史 文章目录 Java系列文章目录一、前言二、学习内容&#xff1a;三、问题描述四、解决方案&#xff1a;4.1 代码4.2 运行结果 五、总结&#xff1a; 一、前言 这些都被淘汰比较少用了…

深入研究基于多层卷积和全连接网络结构的数据处理与特征提取方法

1 问题 卷积层的输入输出的shape的计算公式探究多个卷积层加上多个全连接层的输出方法 2 方法 卷积层的输入输出的shape的计算公式&#xff1a;输出形状的计算公式&#xff1a;输出高度 (输入高度 - 卷积核高度 2 * 填充) / 步长 1输出宽度 (输入宽度 - 卷积核宽度 2 * 填…

一码空传临时网盘PHP源码,支持提取码功能

源码介绍 一码空传临时网盘源码V2.0免费授权&#xff0c;该源码提供了一个简单易用的无数据库版临时网盘解决方案。前端采用了layui开发框架&#xff0c;后端使用原生PHP编写&#xff0c;没有引入任何开发框架&#xff0c;保持了代码的简洁和高效。 这个程序使用了一个无数据…

设计模式 装饰模式(Decorator Pattern)

装饰器模式简绍 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。这种类型的设计模式属于结构型模式&#xff0c;它是作为现有的类的一个包装。 装饰器模式的基本结构 装饰器模式的基本结构如下&…

【数据管理】DAMA-数据安全

目录 1、概述 2、数据安全要求来源 3、业务驱动因素 4、目标和原则 5、脆弱性、威胁、风险 6、风险分类 7、安全过程 8、数据完整性 9、混淆或脱敏 10、数据安全类型 11、数据安全制约因素 12、系统安全风险 13、工具 1、概述 数据安全包括安全策略和过程的规划、…

无人机动力系统设计之电调芯片参数选型

无人机动力系统设计之电调芯片参数选型 1. 源由2. 关键因素2.1 电压范围2.2 电流处理能力2.3 控制方式2.4 PWM输出与分辨率2.5 通讯接口2.6 保护功能2.7 支持霍尔传感器与无传感器模式2.8 集成度与外围器件2.9 效率与散热2.10 市场供应与成本 3. 因素阐述3.1 PWM工作频率3.1.1 …

二次规划及其MATLAB实现

引言 二次规划&#xff08;Quadratic Programming, QP&#xff09;是一类重要的优化问题&#xff0c;其目标函数为二次函数&#xff0c;约束条件为线性不等式或等式。二次规划问题在工程、经济、金融等领域有广泛应用&#xff0c;如投资组合优化、人脸表情动画的权重求解、机械…

UE中如何制作后处理设置面板

1&#xff09;UE中如何制作后处理设置面板 2&#xff09;Magica Clothes 2插件与Burst编译问题 3&#xff09;UI大小和文本变量 4&#xff09;如何检索直线与网格的所有交点 这是第399篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&#xff0c;涵盖了UWA问答、社…

tabBar设置底部菜单选项以及iconfont图标,setTabBar设置TabBar和下拉刷新API

tabBartabBar属性:设置底部 tab 的表现 ​ ​ ​ ​ 首先在pages.json页面写一个tabBar对象,里面放入list对象数组,里面至少要有2个、最多5个 tab, 如果只有一个tab的话,H5(浏览器)依然可以显示底部有一个导航栏,如果没有,需要重启后才有,小程序则报错,只有2个以上才可以…

51单片机-蜂鸣器介绍-1

作者&#xff1a;王开心 时间&#xff1a;2024.9.11 目的&#xff1a;学习51进阶中。。。 蜂鸣器是一种一体化结构的电子讯响器&#xff0c; 采用直流电压供电&#xff0c; 广泛应用于计算机、 打印机、 复印机、 报警器、 电子玩具、 汽车电子设备、 电话机、 定时器等电子…