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)
上一篇 2022年1月28日 上午9:00
下一篇 2022年1月28日 上午10:00


相关推荐

  • 06 _使用命令在hadoop的HDFS中存储文件

    06 _使用命令在hadoop的HDFS中存储文件

    2021年8月22日
    70
  • pycharm-professional-2022.01.13 激活码(注册激活)

    (pycharm-professional-2022.01.13 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~0V…

    2022年3月31日
    191
  • 程序化交易编程学习_C语言 教程

    程序化交易编程学习_C语言 教程在交易的过程当中,应用程序化交易的都知道,最困难的就是如何构建出一个交易策略,交易策略的构建过程是非常复杂的,一个完整的程序化交易策略是由很多的相关和独立的步骤组合而成的,同时要把每一个步骤都落实好和在研发的过程中,对于从下个步骤中得到的资讯,要利用它调整和加工上一个步骤,只有这样才能获得一个相对完善的交易策略。接下来,小编和大家分享一下研发交易策略的步骤及具体说明,希望对大家的交易策略有所帮助:…

    2022年10月8日
    5
  • 2021机械组培训

    2021机械组培训NBUT大一培训文档

    2022年5月15日
    63
  • 2021-02-04-scrapy爬虫案例1:爬取博客园新闻版块详情页-基础入门篇[通俗易懂]

    2021-02-04-scrapy爬虫案例1:爬取博客园新闻版块详情页-基础入门篇[通俗易懂]作者:Barranzi_注:本文所有代码、案例测试环境:1.Linux–系统版本:Ubuntu20.04LTS2.windows–系统版本:WIN1064位家庭版所需第三方库安装pillowpipinstallpillow-ihttps://pypi.douban.com/simplemysqlclientpipinstallmysqlclient-ihttps://pypi.douban.com/simple新建scrapy项目

    2022年6月26日
    26
  • windows server ftp服务器怎么搭建_serveru访问ftp

    windows server ftp服务器怎么搭建_serveru访问ftp首先说说什么是ftp?FTP协议是专门针对在两个系统之间传输大的文件这种应用开发出来的,它是TCP/IP协议的一部分。FTP的意思就是文件传输协议,用来管理TCP/IP网络上大型文件的快速传输。FTP最早也是在Unix上开发出来的,并且很长一段时间里只有Unix系统支持FTP功能,后来逐渐普及到其他系统,并成为Internet/Intranet网络中的标准组件。FTP服务器就是局域网信息资源的存储中心,主要是用来进行文件共享和传输。为了便于数据信息的共享和沟通,很多企业甚至个人都想搭建自己的ftp

    2025年11月2日
    5

发表回复

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

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