题目:
给定一个单链表的头节点 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=nullptrroot->right=BuildTree(mid->next,right);//递归右子树return root;//返回根节点即可}TreeNode* sortedListToBST(ListNode* head) {return BuildTree(head,nullptr);}
};
时间复杂度:O(nlogn)
空间复杂度:O(logn)
相似题目可以参考有序数组转换成二叉搜索树 。