将有序链表转换为二叉搜索树

题目:

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

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。

 

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

解题思路:

 1.因为二叉搜索树相当于是中序遍历的结果,而链表是有序的,那么链表的中位节点一定是二叉树的根节点,所以我们先通过快慢指针找到根节点

2.找到根节点后,就确定了左右子树的节点位置,递归的构建左右子树即可

源代码如下:

class Solution {
public://通过快慢指针获取中位节点,即为根节点ListNode* GetMid(ListNode* left,ListNode* right){ListNode* fast=left;ListNode* slow=left;while(fast!=right&&fast->next!=right){fast=fast->next->next;slow=slow->next;}return slow;}//递归的构建左右子树TreeNode* BuildTree(ListNode* left,ListNode* right){if(left==right) return nullptr;ListNode* mid=GetMid(left,right);//获取中位节点TreeNode* root=new TreeNode(mid->val);//创建根节点//区间为左闭右开[left,right),所以在这个范围内的都是左子树上的节点root->left=BuildTree(left,mid);//递归左子树//[mid->next,right]范围内的都是右子树上的节点,这里right=nullptrroot->right=BuildTree(mid->next,right);//递归右子树return root;//返回根节点即可}TreeNode* sortedListToBST(ListNode* head) {return BuildTree(head,nullptr);}
};

时间复杂度:O(nlog⁡n)
空间复杂度:O(logn)

相似题目可以参考有序数组转换成二叉搜索树 。

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

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

相关文章

Python:Spider爬虫工程化入门到进阶(1)创建Scrapy爬虫项目

Python:Spider爬虫工程化入门到进阶系列: Python:Spider爬虫工程化入门到进阶(1)创建Scrapy爬虫项目Python:Spider爬虫工程化入门到进阶(2)使用Spider Admin Pro管理scrapy爬虫项目 本文通过简…

2023牛客暑期多校训练营6 A-Tree (kruskal重构树))

文章目录 题目大意题解参考代码 题目大意 ( 0 ≤ a i ≤ 1 ) , ( 1 ≤ c o s t i ≤ 1 0 9 ) (0\leq a_i\leq 1),(1 \leq cost_i\leq 10^9) (0≤ai​≤1),(1≤costi​≤109) 题解 提供一种新的算法,kruskal重构树。 该算法重新构树,按边权排序每一条边…

W6100-EVB-PICO做DNS Client进行域名解析(四)

前言 在上一章节中我们用W6100-EVB-PICO通过dhcp获取ip地址(网关,子网掩码,dns服务器)等信息,给我们的开发板配置网络信息,成功的接入网络中,那么本章将教大家如何让我们的开发板进行DNS域名解…

uniapp 返回上一页并刷新

如要刷新的是mine页面 在/pages/mine/improveInfo页面修改信息,点击保存后跳转到个人中心(/pages/mine/index)页面并刷新更新数据 点击保存按钮时执行以下代码: wx.switchTab({url: /pages/mine/index }) // 页面重载 let pages …

PDM系统解密:数据管理的利器

在当今数字化时代,数据管理对企业的重要性不言而喻。而PDM系统作为一款强大的数字化工具,正扮演着企业数据管理的利器角色。让我们一同探索PDM系统的功能科普,了解它是如何助力企业高效管理数据,实现卓越发展的。 一、数据中心化存…

VR 变电站事故追忆反演——正泰电力携手图扑

VR(Virtual Reality,虚拟现实)技术作为近年来快速发展的一项新技术,具有广泛的应用前景,支持融合人工智能、机器学习、大数据等技术,实现更加智能化、个性化的应用。在电力能源领域,VR 技术在高性能计算机和专有设备支…

【蓝桥杯备考资料】如何进入国赛?

目录 写在前面注意事项数组、字符串处理BigInteger日期问题DFS 2013年真题Java B组世纪末的星期马虎的算式振兴中华黄金连分数有理数类(填空题)三部排序(填空题)错误票据幸运数字带分数连号区间数 2014年真题蓝桥杯Java B组03猜字…

OpenGL ES 3.0 PBO Pixel Buffer Object 像素缓冲区对象

该原创文章首发于微信公众号:字节流动 PBO 是什么 OpenGL PBO(Pixel Buffer Object),被称为像素缓冲区对象,主要被用于异步像素传输操作。PBO 仅用于执行像素传输,不连接到纹理,且与 FBO (帧缓冲区对象)无关。 OpenGL PBO(像素缓冲区对象) 类似于 VBO(顶点缓冲区…

iMX6ULL驱动开发 | OLED显示屏SPI驱动实现(SH1106,ssd1306)

周日业余时间太无聊,又不喜欢玩游戏,大家的兴趣爱好都是啥?我觉得敲代码也是一种兴趣爱好。正巧手边有一块儿0.96寸的OLED显示屏,一直在吃灰,何不把玩一把?于是说干就干,最后在我的imax6ul的lin…

【WebRTC---源码篇】(二:一)PeerConnection详解

Track的添加 上图是整体流程图 RTCErrorOr<rtc::scoped_refptr<RtpSenderInterface>> PeerConnection::AddTrack(rtc::scoped_refptr<MediaStreamTrackInterface> track,const std::vector<std::string>& stream_ids) {RTC_DCHECK_RUN_ON(signal…

LabVIEW深度相机与三维定位实战(下)

‍‍&#x1f3e1;博客主页&#xff1a; virobotics的CSDN博客&#xff1a;LabVIEW深度学习、人工智能博主 &#x1f384;所属专栏&#xff1a;『LabVIEW深度学习实战』 &#x1f37b;上期文章&#xff1a;『LabVIEW深度相机与三维定位实战&#xff08;上&#xff09;』 &#…

pycharm——漏斗图

import pyecharts.options as opts from pyecharts.charts import Funnel""" Gallery 使用 pyecharts 1.1.0 参考地址: https://echarts.apache.org/examples/editor.html?cfunnel目前无法实现的功能:1、暂时无法对漏斗图的长宽等范围操作进行修改 ""…