Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
Depth-first Search Linked List方法一:借助Convert Sorted Array to Binary Search Tree 的方法,先将list转成vector即可,时间复杂度O(n),转化过程就是O(n),空间复杂度O(n)
class Solution { public: TreeNode *sortedListToBST(ListNode *head) { vector<int> num; while(head != NULL) { num.push_back(head->val); head = head->next; } return sortedArrayToBST(num); } TreeNode *sortedArrayToBST(vector<int> &num) { int size = num.size(); if(size == 0) return NULL; return sortedArrayToBSTInternal(num, 0, size - 1); } TreeNode *sortedArrayToBSTInternal(vector<int> &num, int low, int high) { // the code is very important, i.e: low = 4, hight = 5, mid = 4, // will call sortedArrayToBSTInternal(num, 4, 3) if(low > high) return NULL; if(low == high) return new TreeNode(num[low]); int mid = (high-low)/2 + low; cout << mid << endl; TreeNode *root = new TreeNode(num[mid]); TreeNode *left = sortedArrayToBSTInternal(num, low, mid - 1); TreeNode *right = sortedArrayToBSTInternal(num, mid + 1, high); root->left = left; root->right= right; return root; } };
方法二:找出当前链表的中间节点,然后再递归左右的子链表,开始的时候程序先计算链表总厂,然后传入两个前后索引指针,最后每次递归找出中间节点即可。
时间复杂度O(n^2),空间复杂度O(logn),递归导致stack用O(logn)
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ /** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: int calLen(ListNode *node) { int len = 0; while(node) { len++; node = node->next; } return len; } TreeNode *createTree(ListNode *node, int left, int right) { if (left > right) return NULL; int mid = (left + right) / 2; ListNode *p = node; for(int i = left; i < mid; i++) p = p->next; TreeNode *leftNode = createTree(node, left, mid - 1); TreeNode *rightNode = createTree(p->next, mid + 1, right); TreeNode *tNode = new TreeNode(p->val); tNode->left = leftNode; tNode->right = rightNode; return tNode; } TreeNode *sortedListToBST(ListNode *head) { // Start typing your C/C++ solution below // DO NOT write int main() function int len = calLen(head); return createTree(head, 0, len - 1); } };
方法3:
bottom-up,时间复杂度 O(n),空间复杂度 O(logn)
http://blog.csdn.net/salutlu/article/details/24502109 中递归
http://www.bwscitech.com/a/jishuzixun/javayuyan/2013/0930/15822.html
存在一种自底向上 (bottom-up) 的方法,见 http://leetcode.com/2010/11/convert-sorted-list-to-balanced-binary.html
class Solution { public: TreeNode *sortedListToBST(ListNode *head) { int len = 0; ListNode *p = head; while (p) { len++; p = p->next; } return sortedListToBST(head, 0, len - 1); } private: TreeNode* sortedListToBST(ListNode*& list, int start, int end) { if (start > end) return NULL; int mid = start + (end - start) / 2; TreeNode *leftChild = sortedListToBST(list, start, mid - 1); TreeNode *parent = new TreeNode(list->val); parent->left = leftChild; list = list->next; parent->right = sortedListToBST(list, mid + 1, end); return parent; } };