有序链表转换二叉搜索树

有序链表转换二叉搜索树

力扣题目链接
题目描述
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 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%的用户

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值