//由题意得,高度平衡的二叉搜索树左右子树高度差不超过1.
//因此上,让根节点保证在链表序列的中间位置,此时左右子树得高度差不超过1.
//采用递归的方式.
struct ListNode
{
int val;
ListNode* next;
ListNode(int x):val(x),next(NULL){}
};
struct TreeNode
{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x):val(x),left(NULL),right(NULL){}
};
class Solution
{
public:
//寻找有序链表的中间节点(快慢指针)
ListNode* getMid(ListNode* left,ListNode* right)
{
ListNode* fast=left;
ListNode* slow=left;
while(fast!=right && fast->next!=right)
{
fast=fast->next->next;
slow=slow->next;
}
return slow;
}
//建树(递归)
TreeNode* buildTree(ListNode* left,ListNode* right)
{
if(left==right) return NULL;
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* sortListToBST(ListNode* head)
{
return buildTree(head,nullptr);
}
};
C++实现LeetCode有序连边转换二叉搜索树
最新推荐文章于 2024-06-25 23:20:26 发布