• LeetCode刷题系列 -- 109. 有序链表转换二叉搜索树


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

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

    示例 1:

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

    输入: head = []
    输出: []

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/convert-sorted-list-to-binary-search-tree
     

    思路:

           将给定的有序链表转换为二叉搜索树的第一步是确定根节点。由于我们需要构造出平衡的二叉树,因此让根节点左子树中的节点个数与右子树中的节点个数尽可能接近。如此,左右子树的高度也会非常接近,可以达到高度差绝对值不超过 1 的题目要求。

           

         根据中位数的性质,链表中小于中位数的元素个数与大于中位数的元素个数要么相等,要么相差 1。此时,小于中位数的元素组成了左子树,大于中位数的元素组成了右子树,它们分别对应着有序链表中连续的一段。

         在这之后,我们使用分治的思想,继续递归地对左右子树进行构造,找出对应的中位数作为根节点,以此类推。

    链接:https://leetcode.cn/problems/convert-sorted-list-to-binary-search-tree/solution/you-xu-lian-biao-zhuan-huan-er-cha-sou-suo-shu-1-3/
     

    c++

    1. /**
    2. * Definition for singly-linked list.
    3. * struct ListNode {
    4. * int val;
    5. * ListNode *next;
    6. * ListNode() : val(0), next(nullptr) {}
    7. * ListNode(int x) : val(x), next(nullptr) {}
    8. * ListNode(int x, ListNode *next) : val(x), next(next) {}
    9. * };
    10. */
    11. /**
    12. * Definition for a binary tree node.
    13. * struct TreeNode {
    14. * int val;
    15. * TreeNode *left;
    16. * TreeNode *right;
    17. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
    18. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    19. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
    20. * };
    21. */
    22. class Solution {
    23. public:
    24. ListNode* getMiddleNode(ListNode* left, ListNode* right) {
    25. ListNode* slow = left;
    26. ListNode* fast = left;
    27. while(fast != right && fast->next != right) {
    28. slow = slow->next;
    29. fast = fast->next;
    30. fast = fast->next;
    31. }
    32. return slow;
    33. }
    34. TreeNode* buildTree(ListNode* left, ListNode* right) {
    35. if(left==right) {
    36. return nullptr;
    37. }
    38. ListNode* midNode = getMiddleNode(left,right);
    39. TreeNode* root = new TreeNode(midNode->val);
    40. root->left = buildTree(left,midNode);
    41. root->right = buildTree(midNode->next,right);
    42. return root;
    43. }
    44. TreeNode* sortedListToBST(ListNode* head) {
    45. return buildTree(head,nullptr);
    46. }
    47. };

  • 相关阅读:
    mysql面试题6:MySQL索引的底层原理,是如何实现的?B+树和B树的区别?
    sparksql insertinto 源码解析
    SASS常用内置函数
    vue3+vite中使用Lottie动画
    matlab rbf手写
    HEVC(H.265)与AVC(H.264)的区别与联系
    高等数学(第七版)同济大学 习题3-2 个人解答
    如何才能在人力RPO蓝海项目中实现盈利呢?
    02333软件工程历年解答题
    解决js添加元素后onclick无效问题,解决onclick无效问题
  • 原文地址:https://blog.csdn.net/qq_33775774/article/details/127607353