转为数组后再转
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
class Solution { public: TreeNode* sortedListToBST(ListNode* head) { vector<int> nodes; while(head) { nodes.push_back(head->val); head = head->next; } return build(nodes, 0, nodes.size() - 1); } private: TreeNode* build(vector<int>& nodes, int lo, int hi) { if(lo > hi) return nullptr; auto mid = lo + ((hi - lo) >> 1); TreeNode* node = new TreeNode(nodes[mid]); node->left = build(nodes, lo, mid - 1); node->right = build(nodes, mid + 1, hi); return node; } };
|
T(n) : O(n)
S(n) : O(n) + O(logn)(递归栈)
直接使用链表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
class Solution { public: TreeNode* sortedListToBST(ListNode* head) { return build(head, nullptr); } private: TreeNode* build(ListNode* begin, ListNode* end) { if(begin == end) return nullptr; auto mid = getMid(begin, end); TreeNode* node = new TreeNode(mid->val); node->left = build(begin, mid); node->right = build(mid->next, end); return node; } ListNode* getMid(ListNode* begin, ListNode* end) { ListNode* walker = begin; ListNode* runner = begin; while(runner != end && runner->next != end) { runner = runner->next->next; walker = walker->next; } return walker; } };
|
T(n) : O(nlogn)
S(n) : O(logn)(递归栈)
中序遍历+填充
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
class Solution { public: TreeNode* sortedListToBST(ListNode* head) { return build(head, 0, getLength(head) - 1); } private: int getLength(ListNode* head) { int ret = 0; for(; head; ++ret, head = head->next); return ret; } TreeNode* build(ListNode*& head, int lo, int hi) { if(lo > hi) return nullptr; auto mid = lo + (hi - lo) / 2; TreeNode* node = new TreeNode(); node->left = build(head, lo, mid - 1); node->val = head->val; head = head->next; node->right = build(head, mid + 1, hi); return node; } };
|