/* 根据链表构造二叉平衡树
* 每次找到中点然后折半 分别作为左右子树
*
* */
class Solution {
public:
TreeNode* sortedListToBST(ListNode* head) {
// 找到当前链表的中点 构建二叉树 然后返回当前的根节点
if(!head) return NULL;
// 1 2 3 pre p
// 这里引入伪头结点是为了防止只有一个节点时(fast->)或者没有节点时 进行特判 但这里可以考虑只有一个或者0个节点情况
ListNode *pseudo = new ListNode(-1), *p=pseudo, *pre=pseudo, *fast=pseudo;
pseudo->next = head;
while(fast && fast->next){// 循环中一次也没执行就会出错 要么 针对这种情况特判 也么伪头结点
pre = p;
p = p->next;
fast = fast->next->next;
}
pre->next = NULL; // 断链
TreeNode *root = new TreeNode(p->val);
root->left = sortedListToBST(pseudo->next);
root->right = sortedListToBST(p->next);
delete(pseudo);
return root;
}
};
/* 根据链表构造二叉平衡树
* 每次找到中点然后折半 分别作为左右子树
*
* */
class Solution {
public:
TreeNode* sortedListToBST(ListNode* head) {
// 找到当前链表的中点 构建二叉树 然后返回当前的根节点
if(!head) return NULL;
if(!head->next) return new TreeNode(head->val);
ListNode *p=head, *pre=head, *fast=head;
while(fast && fast->next){// 循环中一次也没执行就会出错 要么 针对这种情况特判 也么伪头结点
pre = p;
p = p->next;
fast = fast->next->next;
}
pre->next = NULL; // 断链
TreeNode *root = new TreeNode(p->val);
root->left = sortedListToBST(head);
root->right = sortedListToBST(p->next);
return root;
}
};
来源:https://blog.csdn.net/futangxiang4793/article/details/99322368