当前位置: 代码迷 >> 综合 >> leetcode_117 Convert Sorted List to Binary Search Tree
  详细解决方案

leetcode_117 Convert Sorted List to Binary Search Tree

热度:54   发布时间:2024-02-07 14:21:29.0

题目:

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

For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.

Example:

Given the sorted linked list: [-10,-3,0,5,9],One possible answer is: [0,-3,9,-10,null,5], which represents the following height balanced BST:0/ \-3   9/   /-10  5

 

把有序链表转换成 :平衡二叉搜索树

解法一:使用快慢指针,找到中间节点;将链表分成两部分,递归构造二叉树

代码如下:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* buildBST(ListNode* head,ListNode* tail){if(head == tail)return NULL;ListNode* slow = head;ListNode* fast = head;while(fast != tail && fast->next != tail){slow = slow->next;fast = fast->next->next;}TreeNode* root = new TreeNode(slow->val);root->left = buildBST(head,slow);root->right = buildBST(slow->next,tail);return root;}TreeNode* sortedListToBST(ListNode* head) {if(head == NULL)return NULL;return buildBST(head,NULL);}
};

解法二:将有序链表转换成有序数组,按照上题,通过有序数组构造二叉树的方法构造二叉树,代码复杂度O(n),比解法一的代码复杂度O(nlogn)要低

代码如下:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* buildTree(vector<int>& nums,int left,int right){if(left > right)return NULL;int mid = left + (right - left)/2;TreeNode* root = new TreeNode(nums[mid]);root->left = buildTree(nums,left,mid-1);root->right = buildTree(nums,mid+1,right);return root;}TreeNode* sortedListToBST(ListNode* head) {vector<int> ListToArray;if(head == NULL)return NULL;while(head != NULL){ListToArray.push_back(head->val);head = head->next;}return buildTree(ListToArray,0,ListToArray.size()-1);}
};

 

 

  相关解决方案