Convert Sorted List to Binary Search Tree「建议收藏」

Convert Sorted List to Binary Search Tree

大家好,又见面了,我是全栈君。

Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
想了好久想不出来。后来看了题目分类里面说是DFS,可是没有想出DFS的算法来。后来想到了一个递归的方法。可是空间和时间都是O(n)。
后来网上找了一个空间是O(1)的时间是O(n)的算法,是一种新的解题思路,用的是中递归。

一般我解题都是用的头递归或者尾递归。第一次见识到了中递归,相当于把递归当成了一个循环体,用引用来作为变量,每一个递归中改动,须要非常强大的想象力。把整个递归树在脑子里想清楚。

空间和时间都为O(n):

    TreeNode *sortedListToBST(ListNode *head) 
	{
		vector<TreeNode*> treeNodes;
		while (head != NULL)
		{
			TreeNode *node = new TreeNode(head->val);
			treeNodes.push_back(node);
			head = head->next;
		}
		return genBST(0, treeNodes.size()-1, treeNodes);
    }
	
	TreeNode* genBST(int start, int end, vector<TreeNode*> &treeNodes)
	{
		if (start == end) return treeNodes[start];
		else if (start+1 == end)
		{
			treeNodes[start]->right = treeNodes[end];
			return treeNodes[start];
		} 

		int mid = (start+end)/2;
		TreeNode* root = treeNodes[mid];
		root->left = genBST(start, mid-1, treeNodes);
		root->right = genBST(mid+1, end, treeNodes);
		return root;
	}

空间为O(1)时间为O(n):

	TreeNode *sortedListToBST(ListNode *head)
	{
	    int len = 0;
        ListNode * node = head;
        while (node != NULL)
        {
            node = node->next;
            len++;
        }
        return buildTree(head, 0, len-1);
    }
    
    TreeNode *buildTree(ListNode *&node, int start, int end)
    {
        if (start > end) return NULL;
        int mid = start + (end - start)/2;
        TreeNode *left = buildTree(node, start, mid-1);
        TreeNode *root = new TreeNode(node->val);
        root->left = left;
        node = node->next;
        root->right = buildTree(node, mid+1, end);
        return root;
    }

解法引用:http://www.bwscitech.com/a/jishuzixun/javayuyan/2013/0930/15822.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115955.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 理解self,this,parent

    理解self,this,parent

    2021年6月30日
    84
  • 大数据Lambda架构详解

    大数据Lambda架构详解Lambda架构是NathanMarz提出的一个实时大数据处理框架。NathanMarz是著名的实时大数据处理框架Storm的作者,Lambda架构就是其根据多年分布式大数据系统的经验总结提炼而成。NathanMarz在BigData:Principlesandbestpracticesofscalablereal-timedatasystems一书中提到了很多实时大数据系统的关键特性,包括容错性,健壮性,低延迟,可扩展,通用性,方便查询等,Lambda就是其根据这些特性设计的一

    2022年6月25日
    36
  • Quartus II 操作入门[通俗易懂]

    Quartus II 操作入门[通俗易懂]使用Quartus设计FPGA,简单包括以下流程:新建工程,写代码编译工程,找错误分配引脚,重编译下载配置,到硬件为保证设计的正确性,在编译后,一般还需要做仿真验证,然后下载至硬件,有两种仿真方式:-功能仿真-时序仿真新建工程,写代码创建工程文件夹在电脑上新建一个文件夹,例如E:\Lianxi_1。工程的文件将全都存在这个文件夹内,便于管理。一个工程对应一个文件夹。新建

    2022年10月15日
    0
  • uCOS OSTaskCreate()函数分析[通俗易懂]

    uCOS OSTaskCreate()函数分析[通俗易懂]INT8U OSTaskCreate(void(*task)(void*pd), void*p_arg,OS_STK*ptos,INT8Uprio);函数返回一个8位的整型数,调用该函数需要四个参数。第一个参数一个指针,也就是用户代码的首地址,在平时使用中我们把自己创建的任务的名字作为这个参数就可以了;第三个参数是指向任务堆栈栈顶的指针,通常我们把创建的任务的堆栈数组的首地址

    2022年9月5日
    1
  • SODA-大型活动大规模人群的识别和疏散:从公交2.0到公交3.0

    SODA-大型活动大规模人群的识别和疏散:从公交2.0到公交3.02019独角兽企业重金招聘Python工程师标准>>>…

    2022年7月16日
    15
  • RabbitMQ脑裂「建议收藏」

    RabbitMQ脑裂「建议收藏」在RabbitMQ3.4.x中会出现错误的网络分区检测(某种意义上可以称之为脑裂)的现象,本文通过实验验证此现象,愿小伙伴们少走弯路。Preview网上有两篇帖子(需要翻墙)https://groups.google.com/forum/#!topic/rabbitmq-users/dt8VFhMb2zMhttps://groups.google.com/forum/#!top…

    2025年7月8日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号