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

探讨力扣题库108题解,将升序数组高效转换为高度平衡二叉搜索树的方法,通过选取中点作为根节点并递归构造左右子树,实现时间复杂度O(N)的解决方案。

力扣题库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上关注我,如果有问题欢迎在底下的评论区交流,谢谢。

以下是一些可以将力扣数组转化为二叉树进行可视化的在线工具: ### LeetCode自带可视化功能 在LeetCode的调试界面中,对于二叉树相关的题目,当你输入数组形式的二叉树数据后,它会有一定的可视化展示。你可以在提交代码前对输入进行调试,从而查看二叉树的结构。 ### Binary Tree Visualizer 这是一个专门用于二叉树可视化的在线工具。你可以手动输入力扣中的数组形式的二叉树数据,它会将其转换为直观的二叉树图形。其网址为:https://visualgo.net/en/bst ,虽然它主要展示二叉搜索树,但普通二叉树也能很好地可视化。 ### Tree Visualization 该工具允许用户输入二叉树的数据,支持以数组的形式输入,然后将其转换为二叉树的图形展示。可以通过它快速地将力扣中的数组转化为二叉树进行可视化查看。其网址为:https://treevis.net/ ### CoderPad CoderPad 不仅是一个在线代码编辑器,还支持代码运行结果可视化。你可以编写代码将力扣数组转换为二叉树,然后利用绘图库或者自定义输出逻辑来实现二叉树的可视化。它支持多种编程语言,如 Python、Java 等。网址为:https://coderpad.io/ ### VisuAlgo VisuAlgo 提供了丰富的数据结构可视化功能,其中就包括二叉树。你可以输入数组数据,它会自动生成对应的二叉树可视化图形,方便你理解分析二叉树的结构。网址为:https://visualgo.net/zh/bst ```python # 以下是一个简单的 Python 示例,将数组转换为二叉树节点类表示 class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def array_to_tree(arr): if not arr: return None root = TreeNode(arr[0]) queue = [root] i = 1 while queue and i < len(arr): node = queue.pop(0) if arr[i] is not None: node.left = TreeNode(arr[i]) queue.append(node.left) i += 1 if i < len(arr) and arr[i] is not None: node.right = TreeNode(arr[i]) queue.append(node.right) i += 1 return root # 示例数组 arr = [1, 2, 3, 4, 5] root = array_to_tree(arr) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值