该道题需要我们将排序好的链表转换为平衡二叉排序树。注意,二叉排序树的概念是左子树的所有节点值比头结点值要小,右子树的所有节点值比头结点要大。而这道题还做出平衡二叉树的要求,也即:
左子树的深度和右子树的深度之差的绝对值不超过1。
我们可以来思考,对于已经有序的链表,是否可以考虑取中间节点为树的头结点,链表左侧表示树的左子树而右侧表示树的右子树。见如下图片:
好了,看完图片后我们开始写代码。这里对于链表查找中间节点的方式可以用快慢指针的方式。即:
- 快指针一次移动两个next;
- 慢指针一次移动一个next;
- 最后当快指针指到链表尾时慢指针所指即是中间节点。
代码如下图所示:
ListNode* find(ListNode* head, ListNode* tar)
{
if(head==tar)
return NULL;
ListNode* temp=head;
for(;(temp->next)!=tar;temp=temp->next);
temp->next=NULL;
return head;
}
TreeNode* sortedListToBST(ListNode* head) {
if(head)
{
ListNode* fast=head;
ListNode* slow=head;
while(fast&&fast->next)
{
fast=fast->next->next;
slow=slow->next;
}
TreeNode* finall=new TreeNode(slow->val);
ListNode* right=slow->next;
ListNode* left=find(head,slow);
finall->left=sortedListToBST(left);
finall->right=sortedListToBST(right);
return finall;
}
else
{
return NULL;
}
}
这是测试结果图: