/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
利用分治递归得到搜索树, 参数为递归中树链表的头节点,以及树的节点总数目
TreeNode* my_buildTree(ListNode* head, int num)
{
//边界条件:空树,返回空
if(head == nullptr)
return nullptr;
//边界条件:叶子节点,返回叶子节点即可
if(head->next == nullptr)
{
TreeNode* root = new TreeNode(head->val);
return root;
}
//定义此轮递归左子树在链表中的尾节点
ListNode* left_back = head;
//得到此轮递归左子树和右子树的节点数量
int left_num = num / 2;
int right_num = num - left_num - 1;
//得到此轮递归左子树在链表中的尾节点,将其next置为nullptr,这样就得到一颗独立的树
for(int i = 0; i < left_num - 1; i++)
{
left_back = left_back->next;
}
//此轮递归右子树在链表中的开始节点
ListNode* rTree_left = left_back->next->next;
//此轮递归搜索二叉树的根节点
TreeNode* root = new TreeNode(left_back->next->val);
left_back->next = nullptr;
root->left = my_buildTree(head, left_num);
root->right = my_buildTree(rTree_left, right_num);
return root;
}
TreeNode* sortedListToBST(ListNode* head) {
//边界条件:链表为空,直接返回空树
if(head == nullptr)
return nullptr;
//得到链表长度
int count = 0;
ListNode* p = head;
while(p->next != nullptr)
{
count++;
p = p->next;
}
//利用分治递归得到搜索树
return my_buildTree(head, count);
}
};