Convert Sorted List to Binary Search Tree
方法一:最简单的方法是将列表中的数字存储在vector中,那么方法同上
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode* sortedListToBST(ListNode* head) { vector<int> nums; for(; head != nullptr; head = head->next) nums.push_back(head->val); sort(nums.begin(), nums.end()); return sortedToBST(nums, 0, nums.size()); } TreeNode *sortedToBST(vector<int> &nums, int lt, int rt) { if(lt >= rt) return nullptr; int mid = (lt + rt) / 2; TreeNode *ret = new TreeNode(nums[mid]); ret->left = sortedToBST(nums, lt, mid); ret->right = sortedToBST(nums, mid+1, rt); return ret; } };
方法二:基于列表遍历的方式,这里需要注意当遍历右子树时,lt=0而不是mid+1;
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode* sortedListToBST(ListNode* head) { int len = 0; ListNode dummy(-1); dummy.next = head; for(; head != nullptr; ++len, head = head->next); return sortedListToBST(dummy.next, 0, len); } TreeNode* sortedListToBST(ListNode *head, int lt, int rt) { if(lt >= rt) return nullptr; int mid = (lt + rt) / 2; ListNode *begin = head; for(int i=0; i<mid; head = head->next, ++i); TreeNode *ret = new TreeNode(head->val); ret->left = sortedListToBST(begin, lt, mid); ret->right = sortedListToBST(head->next, 0, rt-mid-1); return ret; } };

浙公网安备 33010602011771号