将单链表转换为平衡二叉查找树,因为单链表已经为升序排列,采用递归。
步骤
1,找到链表的中间节点,该节点作为当前的父节点
2,递归单链表中该父节点左部的所有节点以及右部的所有节点,中心节点分别作为该父节点的左指针和右指针。
注意,链表中只一个结点和两个结点时需要分情况讨论。
代码
class Solution
{
public:
TreeNode *sortedListToBST(ListNode *head)
{
TreeNode *treeHead = NULL;
if(head==NULL)
return treeHead;
ListNode *end = head;
while(end->next)
end = end->next;
return sortedListToBSTHelper(head, end);
}
TreeNode *sortedListToBSTHelper(ListNode *start, ListNode *end)
{
TreeNode *treeNode = NULL;
treeNode = new TreeNode(0);
// 当前链表中只有一个结点的情况
if(start==end)
{
treeNode->val = start->val;
return treeNode;
}
//当前链表中有两个结点的情况
if(end == start->next)
{
treeNode->val = start->val;
TreeNode *Node = new TreeNode(end->val);
treeNode->right = Node;
return treeNode;
}
ListNode *pre, *p, *prepre;
pre = start;
prepre = pre;
p = start;
//找到当前链表的中间结点
while(p&&pre->next&&p->next&&p->next->next)
{
prepre = pre;
pre = pre->next;
p = p->next->next;
}
treeNode->val = pre->val;
prepre->next = NULL;
//递归找到中间节点的左右结点
treeNode->left= sortedListToBSTHelper(start, prepre);
treeNode->right = sortedListToBSTHelper(pre->next, end);
return treeNode;
}
};