题目:
给定一个单链表的头节点 head
,其中的元素 按升序排序 ,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。
输入: head = [-10,-3,0,5,9]
输出: [0,-3,9,-10,null,5]
解释: 一个可能的答案是[0,-3,9,-10,null,5],它表示所示的高度平衡的二叉搜索树。
解题思路:
1.因为二叉搜索树相当于是中序遍历的结果,而链表是有序的,那么链表的中位节点一定是二叉树的根节点,所以我们先通过快慢指针找到根节点
2.找到根节点后,就确定了左右子树的节点位置,递归的构建左右子树即可
源代码如下:
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 nullptr;
ListNode* mid=GetMid(left,right);//获取中位节点
TreeNode* root=new TreeNode(mid->val);//创建根节点
//区间为左闭右开[left,right),所以在这个范围内的都是左子树上的节点
root->left=BuildTree(left,mid);//递归左子树
//[mid->next,right]范围内的都是右子树上的节点,这里right=nullptr
root->right=BuildTree(mid->next,right);//递归右子树
return root;//返回根节点即可
}
TreeNode* sortedListToBST(ListNode* head) {
return BuildTree(head,nullptr);
}
};
时间复杂度:O(nlogn)
空间复杂度:O(logn)
相似题目可以参考有序数组转换成二叉搜索树 。