题目
Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
将排序好的链转换为二叉查找树。
问题和之前的相似,但是由于链不能随机访问,如果反复顺序读取相应位置代价太大,显然不可取。
递归求解,先递归求解左子树,同时修改根的位置。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode *innerLTB(ListNode *&head,int begin,int end) //头,指针的引用,不断修改使在root使用时指向中间位置;头尾
{
if(begin>=end)
return NULL;
int mid=(begin+end)/2; //求中间位置
TreeNode *left=innerLTB(head,begin,mid); //递归求左子树,由底向上
TreeNode *root=new TreeNode(head->val); //构建中间节点
root->left=left;
head=head->next; //每次构建后链指针后移
TreeNode *right=innerLTB(head,mid+1,end); //递归求右子树的节点
root->right=right;
return root;
}
TreeNode *sortedListToBST(ListNode *head) {
int len=0; //求长度
ListNode *h=head;
while(h!=NULL)
{
h=h->next;
len++;
}
return innerLTB(head,0,len);
}
};