TreeNode* sortedListToBST(ListNode* head) { if (head == nullptr) return nullptr; vector<int> nums; while (head != nullptr) { nums.emplace_back(head->val); head = head->next; } std::function<TreeNode* (int, int)> sortedListToBSTHelper = [&](int low, int high) -> TreeNode* { if (low > high) return nullptr; if (low == high) return new TreeNode(nums[low]); int mid = low + (high - low)/2; TreeNode* root = new TreeNode(nums[mid]); root->left = sortedListToBSTHelper(low, mid-1); root->right = sortedListToBSTHelper(mid+1, high); return root; }; TreeNode* root = sortedListToBSTHelper(0, nums.size()-1); return root; }
// !!!!! so important *&. here need to use *& to change the node which cur point TreeNode* sortedListToBSTHelper(ListNode* &cur, int start, int end){ // update cur: cur is the last node after construction if(start > end) return NULL; // !!!terminate condition int mid = start + (end - start) / 2; TreeNode* ltree = sortedListToBSTHelper(cur,start, mid - 1); // use start and end TreeNode* subroot = new TreeNode(cur->val); // mid !!! // cur means the points will be use!!! subroot->left = ltree; cur = cur->next; TreeNode* rtree = sortedListToBSTHelper(cur, mid + 1, end); subroot->right = rtree; return subroot; }
TreeNode* sortedListToBSTHelper(ListNode* head, int nodeNum) { if(head == NULL || nodeNum == 0) { return NULL; } ListNode* mid = head; int midNum = nodeNum / 2; while(midNum--) { mid = mid->next; } TreeNode *root = new TreeNode(mid->val); root->left = sortedListToBSTHelper(head, nodeNum/2); root->right = sortedListToBSTHelper(mid->next, nodeNum - nodeNum/2 - 1); return root; }
TreeNode* sortedListToBST(ListNode* head) { int nodeNum = 0; ListNode* p = head; while(p) { p = p->next; nodeNum++; } return sortedListToBSTHelper(head, nodeNum); }
TreeNode* sortedListToBST(ListNode* head){ int len = 0; ListNode* cur = head; while(cur){ len++; cur = cur->next; } sortedListToBSTHelper(head, 0, len - 1); }