给定一个单链表的头节点 head
,其中的元素 按升序排序 ,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。
示例 1:
输入: head = [-10,-3,0,5,9] 输出: [0,-3,9,-10,null,5] 解释: 一个可能的答案是[0,-3,9,-10,null,5],它表示所示的高度平衡的二叉搜索树。
示例 2:
输入: head = [] 输出: []
代码如下:
//方法一:
class Solution {
public:
ListNode* getmid(ListNode* left,ListNode* right)//利用快慢指针找到链表的中点
{
ListNode* slow=left;
ListNode* fast=left;
while(fast->next!=right&&fast->next->next!=right)
{
slow=slow->next;
fast=fast->next->next;
}
return slow;
}
TreeNode* buildtree(ListNode* left,ListNode* right)
{
if(left==right)
{
return nullptr;
}
ListNode* mid=getmid(left,right);//定义中点
TreeNode* root=new TreeNode(mid->val);//将中点的值设置为二叉树的根节点
root->left=buildtree(left,mid);//左子树依次进行递归
root->right=buildtree(mid->next,right);//右子树依次进行递归
return root;
}
TreeNode* sortedListToBST(ListNode* head) {
return buildtree(head,nullptr);//返回最终结果
}
};
//方法二:
class Solution {
public:
TreeNode* helper(vector<int>&nums,int left,int right)
{
if(left>right)
{
return nullptr;
}
int mid=(left+right)/2;//定义中点
TreeNode* root=new TreeNode(nums[mid]);//将中点的值作为根节点
root->left=helper(nums,left,mid-1);//依次创建左子树和右子树
root->right=helper(nums,mid+1,right);
return root;//返回根节点
}
TreeNode* sortedListToBST(ListNode* head) {
vector<int> nums;//将链表中的值放进数组里
while(head!=nullptr)
{
nums.push_back(head->val);
head=head->next;
}
return helper(nums,0,nums.size()-1);//返回最终结果
}
};