当前位置: 首页 > 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.dtcms.com/a/325469.html

相关文章:

  • 深入浅出设计模式——行为型模式之观察者模式 Observer
  • vlan (hybird) 实验
  • Python bisect 库详细介绍
  • 【Java基础】你认为Java的优势是什么
  • 【C语言入门级教】函数指针变量
  • 当 WAF 遇上黑客——一次混合式攻击的应急复盘
  • GO学习记录三
  • 5G 非地面网络(NTN)最专业的方案
  • Docker 详解(保姆级安装+配置+使用教程)
  • 【MySQL✨】服务器安装 MySQL 及配置相关操作
  • 零 shot 语义+在线闭环:深度学习让机器人学会“主动”
  • JavaWeb-后端Web实战(IOC + DI)
  • 第八篇:交互入门:鼠标拾取物体
  • TRS(总收益互换)系统架构设计:多市场交易的技术实现分析
  • 网络编程~
  • 套接字技术、视频加载技术、断点续传技术
  • 前端执行上下文(简版)
  • 2025.8.6 图论(1)Solution
  • 大模型提示词工程实践:聊天机器人定制与实践-打造个性化任务助手
  • Oracle 19C 配置TAF
  • 投资光伏怕成本超标?鹧鸪云系统配置最优方案
  • 微算法科技(NASDAQ:MLGO)通过蚁群算法求解资源分配的全局最优解,实现低能耗的区块链资源分配
  • 【深度学习计算性能】03:自动并行
  • Apache Ignite 生产级的线程池关闭工具方法揭秘
  • 【C++】封装哈希表模拟实现unordered_set和unordered_map
  • 【10】微网优联——微网优联 嵌入式技术一面,校招,面试问答记录
  • 【Linux让旧电脑重获新生的奇妙魔法】
  • 【k8s】k8s安装与集群部署脚本
  • Godot ------ 平滑拖动03
  • 量子神经网络:从NISQ困境到逻辑比特革命的破局之路