/**
* 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) {}
* };
*/
/**
方法一 分治 + 双指针
链表有序,建立为平衡二叉树时,中点值即为根节点,所以快慢指针获取中点作为根节点
递归建立左子树,区间为(ledt, mid - 1)左闭右开,右子树(mid->next, right)左闭右开
左子树右区间闭合处为根节点,右子树右区间闭合处为链表末端
时间复杂度 O(nlgn) 空见复杂度 O(lgn)
**/
class Solution {
public:
ListNode *getMid(ListNode *left, ListNode *right) {
ListNode *fast = left, *slow = left;
while(fast != right && fast->next != right) {
fast = fast->next->next;
slow = slow->next;
}
return slow;
}
TreeNode *buildTree(ListNode *left, ListNode *right) {
//左闭右开
if(left == right)return nullptr;
ListNode *mid = getMid(left, right);
TreeNode *root = new TreeNode(mid->val);
root->left = buildTree(left, mid);
root->right = buildTree(mid->next, right);
return root;
}
TreeNode* sortedListToBST(ListNode* head) {
return buildTree(head, nullptr);
}
};
/**
方法二 分治 + 中序遍历
预先为每一个节点按照中序遍历顺序(链表的顺序)给定下标(0, n - 1),即算出链表长度即可,
同样方法获取中点值即为根节点,采用中序遍历,遍历到左子树根部节点时,此时节点为左子树的
最左节点即为中序遍历的第一个节点,即链表头结点的值,赋值给当前树的节点即可
时间复杂度 O(n) 空间复杂度 O(lgn)
**/
class Solution {
public:
//链表长度
int getLength(ListNode *head) {
int ans = 0;
ListNode *temp = head;
while(temp) {
++ans;
temp = temp->next;
}
return ans;
}
//递归 + 中序遍历创建二叉排序树
TreeNode *buildTree(ListNode *&head, int left, int right) {
//递归到空子树返回
if(left > right)return nullptr;
//当前根节点坐标
int mid = (left + right + 1) / 2;
//创建空节点 中序遍历左子树后复制
TreeNode *root = new TreeNode();
//中序遍历左子树
root->left = buildTree(head, left, mid - 1);
//对应中序遍历序列给对应二叉树位置节点赋值
root->val = head->val;
//链表后移,递归创建右子树
head = head->next;
root->right = buildTree(head, mid + 1, right);
return root;
}
TreeNode *sortedListToBST(ListNode *head) {
int len = getLength(head);
return buildTree(head, 0, len - 1);
}
};
05-31
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交