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

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

题目

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

思路

想完成这道题我们得先知道什么是平衡二叉搜索树,平衡二叉搜索树的定义是左右子树的高度差不能超过1。

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

代码

cpp 复制代码
/**
 * 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);
    }
};
相关推荐
琹箐27 分钟前
最大堆和最小堆 实现思路
java·开发语言·算法
renhongxia11 小时前
如何基于知识图谱进行故障原因、事故原因推理,需要用到哪些算法
人工智能·深度学习·算法·机器学习·自然语言处理·transformer·知识图谱
坚持就完事了1 小时前
数据结构之树(Java实现)
java·算法
算法备案代理1 小时前
大模型备案与算法备案,企业该如何选择?
人工智能·算法·大模型·算法备案
赛姐在努力.1 小时前
【拓扑排序】-- 算法原理讲解,及实现拓扑排序,附赠热门例题
java·算法·图论
野犬寒鸦3 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
霖霖总总3 小时前
[小技巧66]当自增主键耗尽:MySQL 主键溢出问题深度解析与雪花算法替代方案
mysql·算法
rainbow68893 小时前
深入解析C++STL:map与set底层奥秘
java·数据结构·算法
果果燕3 小时前
今日学习笔记:双向链表、循环链表、栈
笔记·学习·链表
wangjialelele3 小时前
平衡二叉搜索树:AVL树和红黑树
java·c语言·开发语言·数据结构·c++·算法·深度优先