• LeetCode


    Convert Sorted List to Binary Search Tree

    2014.2.13 00:46

    Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.

    Solution:

      You may already have solved the problem Convert Sorted Array to Binary Search Tree, which can be done in O(n) time.

      Since linked list is sequential data structure, accessing a node requires O(n) time. The solution is similar for this problem, but time complexity is O(n * log(n)), instead of O(n). Space complexity remains the same O(n).

      T(n) = 2 * T(n / 2)  + O(n) => T(n) = O(n * log(n))

      Another more efficient solution is to convert the linked list to array using an extra vector, and Convert Sorted Array to Binary Search Tree. At least both steps run in O(n) time, it's more efficient after all. Space complexity remains in O(n) scale, but the constant scalar becomes larger.

    Accepted code:

     1 // 1CE, 1AC, excellent.
     2 /**
     3  * Definition for singly-linked list.
     4  * struct ListNode {
     5  *     int val;
     6  *     ListNode *next;
     7  *     ListNode(int x) : val(x), next(NULL) {}
     8  * };
     9  */
    10 /**
    11  * Definition for binary tree
    12  * struct TreeNode {
    13  *     int val;
    14  *     TreeNode *left;
    15  *     TreeNode *right;
    16  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    17  * };
    18  */
    19 class Solution {
    20 public:
    21     TreeNode *sortedListToBST(ListNode *head) {
    22         if (head == nullptr) {
    23             return nullptr;
    24         }
    25         int n = 0;
    26         ListNode *ptr = head;
    27         while (ptr !=  nullptr) {
    28             ptr = ptr->next;
    29             ++n;
    30         }
    31         
    32         if (n == 1) {
    33             return new TreeNode(head->val);
    34         }
    35         
    36         int nl, nr;
    37         int i;
    38         ListNode *head1, *root, *head2;
    39         
    40         nr = (n - 1) / 2;
    41         nl = n - 1 - nr;
    42         // nl must be positive
    43         // nr could be 0
    44         ptr = head;
    45         for (i = 0; i < nl - 1; ++i) {
    46             ptr = ptr->next;
    47         }
    48         head1 = head;
    49         root = ptr->next;
    50         ptr->next = nullptr;
    51         head2 = root->next;
    52         root->next = nullptr;
    53         
    54         TreeNode *tree_root = nullptr;
    55         
    56         tree_root = new TreeNode(root->val);
    57         tree_root->left = sortedListToBST(head1);
    58         tree_root->right = sortedListToBST(head2);
    59         
    60         return tree_root;
    61     }
    62 };
  • 相关阅读:
    树莓派远程连接工具VNC使用教程
    winform开发之UI系列
    设计winform自带动态加载工具按钮和实现热键响应
    winform版弹框操作
    vs2012中将图片放到resource中进行调用
    构建winform控件数据缓存器
    c#跨线程访问控件帮助类
    CSS3过渡
    JavaScript 内置对象 Array 数组
    JavaScript 数组sort方法使用
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3547401.html
Copyright © 2020-2023  润新知