【每日力扣Leetcode】108-将有序数组转换为二叉搜索树

力扣题库108,将有序数组转换为二叉搜索树。

题目链接点这里

题目描述

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

示例:

给定有序数组: [-10,-3,0,5,9],

一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:

      0
     / \
   -3   9
   /   /
 -10  5

解题思路

首先必须得知道什么叫做二叉搜索树

二叉搜索树(Binary Search Tree, BST)的根节点左侧的值都比根节点的值要小,而根节点右侧的值都比根节点的值要大,该规则对于BST中任意子节点也同样适用。

而为了达到平衡二叉树,最简单的方式就是将根节点左右两侧的节点数量尽量相同即可,所以选取中点做为根节点是比较容易想到的。

而对于有序的数组,不管是升序还是降序,我们找到中点做为根节点,然后比中点值小的一半递归返回做为左子节点,比中点值大的一半递归返回做为右子节点,就可以达到目的。

初始答案

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
        if not nums:
            return None 
        node = TreeNode()
        node.val = nums[len(nums)//2]
        if len(nums)==1:
            return node 
        node.left=self.sortedArrayToBST(nums[0:len(nums)//2])
        node.right= self.sortedArrayToBST(nums[len(nums)//2+1:])
        return node

主要需要注意的就是递归推出条件,首先是传入一个空的列表,此时直接返回None。然后当列表长度为1时,就不用继续往下递归了,直接赋值以后进行返回,当然这里不加这个判断也是可以的,因为python里面通过list[a,b]对列表进行切片时,即使a和b的取值非常不合理也并不会报错,而只会返回一个空列表。所以递归的退出只需要考虑空列表的情况即可,加上别的情况是为了节约时间。

因为数组是顺序表的结构,获取中点的时间复杂度为O(1),一共进行了N次获取中点的操作,所以时间复杂度为O(N)。注意这里计算时间复杂度的时候不能因为二分的次数为logN就认为是O(longN),要想到每一次二分都不止一次的进行获取中点操作。

最后提交上去,执行用时: 60 ms,击败了58%的提交

改进答案

目前这种思路就已经能很好地解决问题,并且90%的提交都是在50ms以上,优化空间也不是很大。

注意事项

凡是涉及到递归的情形,退出条件都要格外小心。python对于数组切片的范围没有啥限制,如下

a=[1,2,3]
a[0:0]
Out[3]: []
a[0:-1]
Out[4]: [1, 2]
a[3:]
Out[5]: []
a[4:]
Out[6]: []
a[4:3]
Out[7]: []

所以对于空列表的处理是关键。

我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值