LeetCode Summary
  • Introduction
  • DP, 动态规划类
    • Best Time to Buy and Sell Stock III 题解
    • Best Time to Buy and Sell Stock 题解
    • Climbing Stairs 题解
    • Decode Ways 题解
    • Distinct Subsequences 题解
    • Edit Distance 题解
    • Interleaving String 题解
    • Longest Palindromic Substring 题解
    • Maximum Product Subarray 题解
    • Maximum Subarray 题解
    • Minimum Path Sum 题解
    • Palindrome Partitioning 题解
    • Palindrome Partitioning II 题解
    • Scramble String 题解
    • Triangle 题解
    • Unique Binary Search Trees 题解
    • Unique Paths II 题解
    • Word Break 题解
    • Word Break II 题解
  • list, 链表相关
    • Add Two Numbers 题解
    • Convert Sorted List to Binary Search Tree 题解
    • Copy List with Random Pointer 题解
    • Insertion Sort List 题解
    • LRU Cache 题解
    • Linked List Cycle 题解
    • Linked List Cycle II 题解
    • Merge Two Sorted Lists 题解
    • Merge k Sorted Lists 题解
    • Partition List 题解
    • Remove Duplicates from Sorted List 题解
    • Remove Duplicates from Sorted List II 题解
    • Remove Nth Node From End of List 题解
    • Reorder List 题解
    • Reverse Linked List II 题解
    • Reverse Nodes in k-Group 题解
    • Rotate List 题解
    • Sort List 题解
    • Swap Nodes in Pairs 题解
  • binary tree, 二叉树相关
    • Balanced Binary Tree 题解
    • Binary Tree Inorder Traversal 题解
    • Binary Tree Level Order Traversal 题解
    • Binary Tree Level Order Traversal II 题解
    • Binary Tree Maximum Path Sum 题解
    • Binary Tree Postorder Traversal 题解
    • Binary Tree Preorder Traversal 题解
    • Binary Tree Zigzag Level Order Traversal 题解
    • Construct Binary Tree from Inorder and Postorder Traversal 题解
    • Construct Binary Tree from Preorder and Inorder Traversal 题解
    • Convert Sorted List to Binary Search Tree 题解
    • Flatten Binary Tree to Linked List 题解
    • Maximum Depth of Binary Tree 题解
    • Minimum Depth of Binary Tree 题解
    • Path Sum 题解
    • Path Sum II 题解
    • Populating Next Right Pointers in Each Node 题解
    • Populating Next Right Pointers in Each Node II 题解
    • Recover Binary Search Tree 题解
    • Same Tree 题解
    • Sum Root to Leaf Numbers 题解
    • Symmetric Tree 题解
    • Unique Binary Search Trees 题解
    • Unique Binary Search Trees II 题解
    • Validate Binary Search Tree 题解
  • sort, 排序相关
    • 3Sum Closest 题解
    • 3Sum 题解
    • 4Sum 题解
    • Insert Interval 题解
    • Longest Consecutive Sequence 题解
    • Merge Intervals 题解
    • Merge Sorted Array 题解
    • Remove Duplicates from Sorted Array 题解
    • Remove Duplicates from Sorted Array II 题解
    • Sort Colors 题解
    • Two Sum 题解
  • search, 搜索相关
    • First Missing Positive 题解
    • Find Minimum in Rotated Sorted Array 题解
    • Find Minimum in Rotated Sorted Array II 题解
    • Median of Two Sorted Arrays 题解
    • Search Insert Position 题解
    • Search a 2D Matrix 题解
    • Search for a Range 题解
    • Search in Rotated Sorted Array 题解
    • Search in Rotated Sorted Array II 题解
    • Single Number 题解
    • Single Number II 题解
  • math, 数学类相关
    • Add Binary 题解
    • Add Two Numbers 题解
    • Divide Two Integers 题解
    • Gray Code 题解
    • Integer to Roman 题解
    • Multiply Strings 题解
    • Palindrome Number 题解
    • Plus One 题解
    • [Pow(x, n) 题解](math/Pow(x,-n).md)
    • Reverse Integer 题解
    • Roman to Integer 题解
    • [Sqrt(x) 题解](math/Sqrt(x).md)
    • [String to Integer (atoi) 题解](math/String-to-Integer-(atoi).md)
    • Valid Number 题解
  • string, 字符串处理相关
    • Anagrams 题解
    • Count and Say 题解
    • Evaluate Reverse Polish Notation 题解
    • [Implement strStr() 题解](string/Implement-strStr().md)
    • Length of Last Word 题解
    • Longest Common Prefix 题解
    • Longest Palindromic Substring 题解
    • Longest Substring Without Repeating Characters 题解
    • Longest Valid Parentheses 题解
    • Minimum Window Substring 题解
    • Regular Expression Matching 题解
    • Reverse Words in a String 题解
    • Simplify Path 题解
    • Text Justification 题解
    • Valid Parentheses 题解
    • Wildcard Matching 题解
    • ZigZag Conversion 题解
  • combination and permutation, 排列组合相关
    • Combinations 题解
    • Combination Sum 题解
    • Combination Sum II 题解
    • Letter Combinations of a Phone Number 题解
    • Next Permutation 题解
    • Palindrome Partitioning 题解
    • Permutation Sequence 题解
    • Permutations 题解
    • Permutations II 题解
    • Subsets 题解
    • Subsets II 题解
    • Unique Paths 题解
  • matrix, 二维数组, 矩阵相关
    • Rotate Image 题解
    • Set Matrix Zeroes 题解
    • Spiral Matrix 题解
    • Spiral Matrix II 题解
    • Maximal Rectangle 题解
  • 回溯, BFS/DFS
    • Clone Graph 题解
    • Generate Parentheses 题解
    • N-Queens 题解
    • N-Queens II 题解
    • Restore IP Addresses 题解
    • Sudoku Solver 题解
    • Surrounded Regions 题解
    • Word Ladder 题解
    • Word Ladder II 题解
    • Word Search 题解
  • greedy, 贪心
    • Best Time to Buy and Sell Stock II 题解
    • Jump Game 题解
    • Jump Game II 题解
  • 其他
    • Candy 题解
    • Container With Most Water 题解
    • Gas Station 题解
    • Gray Code 题解
    • Max Points on a Line 题解
    • [Pascal's Triangle 题解](others/Pascal's-Triangle.md)
    • [Pascal's Triangle II 题解](others/Pascal's-Triangle-II.md)
    • Remove Element 题解
    • Trapping Rain Water 题解
Powered by GitBook
On this page
  • tricky 方法, 另外取O(n)空间
  • O(nlogn)时间

Was this helpful?

  1. list, 链表相关

Convert Sorted List to Binary Search Tree 题解

PreviousAdd Two Numbers 题解NextCopy List with Random Pointer 题解

Last updated 5 years ago

Was this helpful?

题目来源:

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

解题思路:

tricky 方法, 另外取O(n)空间

偷懒方法,另外取另外取O(n)空间把list的数据取出来放入数组,然后跟题目一样用数组的方式去做。 代码就略过了。 虽然不是出题者的本意~ 但...... 你咬我呀.

O(nlogn)时间

每次用O(len/2)的时间去把中间的节点找出来。然后跟数组一样的方式解决。时间复杂度为O(nlogn).中途找mid不跟数组一样O(1).

    int length(ListNode * head)
    {
        int len = 0;
        while(head)
        {
            ++len; 
            head = head->next;
        }
        return len;
    }
    TreeNode * convert(ListNode * head, int len)
    {
        if(head == NULL || len == 0) return NULL;
        if(len == 1) return new TreeNode(head->val);
        int mid = len>>1;
        ListNode * pre = head;
        int i = mid;
        while(--i)
            pre=pre->next;
        int leftlen = mid-1; int rightlen = len-mid;//even
        if(len & 0x1)
        {
            pre = pre->next;
            leftlen = mid;
            rightlen = len-mid-1;
        }   
        auto root = new TreeNode(pre->val);
        root->left = convert(head, leftlen);
        root->right = convert(pre->next, rightlen);
    }

    TreeNode *sortedListToBST(ListNode *head) 
    {
        int len = length(head);
        return convert(head, len);
    }

从底至上构造Tree, 递归(得忽略递归调用的时间/空间消耗)调用,递归中传同一个链表,链表不停往前走,通过下标关系来控制左右子树。进入递归时链表指向头节点,结束递归时,链表指向尾节点的next。

    int length(ListNode * head)
    {
        int len = 0;
        while(head)
        {
            ++len; 
            head = head->next;
        }
        return len;
    }
    TreeNode * convert(ListNode * &head, int start, int end)
    {
        assert(start <= end);
        if(start == end) {
            auto result = new TreeNode(head->val); 
            head=head->next;
            return result;
        }
        TreeNode* left = NULL;
        int mid = start + ((end-start)>>1);
        if(start <= mid-1)
            left = convert(head, start, mid-1);
        TreeNode * root = new TreeNode(head->val);
        head = head->next;
        root->left = left;
        if(mid+1 <= end)
            root->right = convert(head, mid+1, end);
        return root;
    }

    TreeNode *sortedListToBST(ListNode *head) 
    {
        if(head == NULL) return NULL;
        int len = length(head);
        return convert(head, 0, len-1);
    }

或许 convert这样写更简洁。

    TreeNode * convert(ListNode * &head, int start, int end)
    {
        if(start > end) return NULL;
        int mid = start + ((end-start)>>1);
        TreeNode* left = convert(head, start, mid-1);
        TreeNode * root = new TreeNode(head->val);
        head = head->next;
        root->left = left;
        root->right = convert(head, mid+1, end);
        return root;
    }

下面代码中,每次递归调用开始时,节点指针都指向区间第一个,结束时节点的指针指向区间末尾的后一个。每次递归调用时,分成左右两部分,左边构造完时,正好指针指向mid,创建一下root,继续构造右部分子树。

Convert Sorted List to Binary Search Tree
ref