有序链表转换二叉搜索树
力扣题目链接
题目描述
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
题解:
二叉搜索树的特点为中序遍历得到的是一个递增序列。而给定的单链表是递增的,所以二叉搜索数的根就是链表的中点。在单链表中如何得到中点呢?首先要想到用快慢指针,一开始两者同时指向链表头,如何快指针一次走两步,慢指针一次走一步。当快指针到达链表尾部时,慢指针刚好指向链表的中点。
二叉搜索树的根为链表中点,根的左子树为链表的前部分,根的右子树为链表的后部分,然后进行递归求解即可。
代码如下:
/** *
Definition for singly-linked list.
* struct ListNode { *
* int val; *
* ListNode *next; *
* ListNode(int x) : val(x), next(NULL) {} *
* };
* *//** * Definition for a binary tree node. *
* struct TreeNode { *
* int val; *
* TreeNode *left; *
* TreeNode *right; *
* TreeNode(int x) : val(x), left(NULL), right(NULL) {} *
* }; */
* class Solution {
* public:
* TreeNode* sortedListToBST(ListNode* head)
* {
* TreeNode* root;
* if(!head)
* {
* return NULL;
* }
* else if(!head->next)
* {
* root=new TreeNode(0);
* root->val=head->val;
* root->left=NULL;
* root->right=NULL;
* return root;
* }
* ListNode *pre=head,*p=pre->next,*q=p->next;
* while(q!=NULL&&q->next!=NULL)
* {
* pre = pre->next;
* p = pre->next;
* q = q->next->next;
* }
* pre->next=NULL;
* root=new TreeNode(0);
* root->val=p->val;
* root->left=sortedListToBST(head);
* root->right=sortedListToBST(p->next);
* return root;
* }
* };
执行用时 :32 ms, 在所有 cpp 提交中击败了89.99% 的用户
内存消耗 :24.5 MB, 在所有 cpp 提交中击败了47.99%的用户