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

力扣109:有序链表转换二叉搜索树

力扣109:有序链表转换二叉搜索树

  • 题目
  • 思路
  • 代码

题目

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

思路

想完成这道题我们得先知道什么是平衡二叉搜索树,平衡二叉搜索树的定义是左右子树的高度差不能超过1。
所以这道题的关键是找到一个合适的根节点,因为如果根节点太小就会导致右子树的高度远大于左子树,根节点太大就导致左子树的高度远大于右子树也就不符合题意了。那么什么样的根节点才是最好的呢?链表的中间节点!如果链表的长度是奇数那么让中间节点来当根节点的话左右子树的高度就是相同的,如果链表的长度是偶数那么左右子树的高度也只是差1而已刚好符合平衡二叉搜索树的定义。想要找到链表的中间节点我们可以使用快慢指针的方法,在找到中间节点后我们就可以使用相同的方法来构建左子树和右子树。

代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
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;}TreeNode* root = new TreeNode();//获得中间节点ListNode* mid = getMid(left,right);root->val = mid->val;root->left = buildTree(left,mid);root->right = buildTree(mid->next,right);return root;}TreeNode* sortedListToBST(ListNode* head) {return buildTree(head,nullptr);}
};
http://www.lryc.cn/news/617844.html

相关文章:

  • Linux下安装jdk
  • 分享一款基于STC8H8K32U-45I-LQFP48单片机的4路数字量输入输出模块
  • STM32——system文件夹
  • Day12 Maven高级
  • 2025牛客多校第七场 双生、象牙 个人题解
  • 大模型提示词工程实践:大语言模型文本转换实践
  • python之uv使用
  • 深度学习和神经网络最基础的mlp,从最基础的开始讲
  • OpenBMC中的snk-psu-manager:架构、原理与应用深度解析
  • 排错000
  • HTML应用指南:利用GET请求获取全国一加授权零售店位置信息
  • 工业相机与智能相机的区别
  • 【05】昊一源科技——昊一源科技 嵌入式笔试, 校招,题目记录及解析
  • 【unity实战】在Unity中实现不规则模型的网格建造系统(附项目源码)
  • 十二、Linux Shell脚本:正则表达式
  • Linux811 YUM;SHELL:if else fi,for
  • 学习嵌入式-IMX6ULL学习——中断
  • easyExcel嵌套子集合导出Excel
  • QT 高分屏不同缩放比例的自适应处理
  • GaussDB 数据库架构师修炼(十三)安全管理(1)-账号的管理
  • Spring Boot启动流程详解
  • 18.WEB 服务器
  • Logistic Loss Function|逻辑回归代价函数
  • 人工智能-python-机器学习-逻辑回归与K-Means算法:理论与应用
  • 【电机控制】FOC单电阻电流采样配置
  • DHCP 服务详解与部署
  • React 19 通用 ECharts 组件
  • Redis应⽤-缓存与分布式锁
  • Linux驱动学习day27天(USB驱动理论部分)
  • 修改学生信息管理系统以及查询