Leetcode 108.将有序数组转换为二叉搜索树(620)

0 阅读1分钟

前引

其实以前就一直听说过写代码花不了多少时间,调试花时间,说实话我大多数时候都是错误后,让ai给我一个提示哪里错了,然后我再修正思路改代码,或者很难的题,直接让ai给修改后的代码然后我去理解后再独立做一遍,但是我发现调试是一个很重要的能力,需要我自己去找问题,所以我就尝试学习打印调试法,以后也会尝试自己多调试,ai辅助

题目

image.png

2026年6月20日(首刷看解)

func sortedArrayToBST(nums []int) *TreeNode {
    root:=handler(nums,0,len(nums)-1)
    return root
}

func handler(nums []int,l,r int) *TreeNode{
    if l>r{
        return nil
    }
     if l==r{
        return &TreeNode{Val:nums[l]}
     }
    mid:=(l+r)/2
    root:=&TreeNode{Val:nums[mid]}
    root.Left=handler(nums,l,mid-1)
    root.Right=handler(nums,mid+1,r)
    return root
}

思路

这道题是一个二分数组的一个思想,来实现建立二叉搜索树 但是涉及一个区间是左闭右闭还是左闭右开

左闭右闭

比如[0,4]说明。l=0,l=4,这就决定了

root:=handler(nums,0,len(nums)-1)

root.Left=handler(nums,l,mid-1) root.Right=handler(nums,mid+1,r)

是len(nums)-1,而不是len(nums)

而举个例子就拿题目给的示例1,当第一个根节点是0,对应下标mid=2时,左子树的下标应该为[0,1],两边都取,右子树为[3,4]说明没问题

左闭右开

比如[0,5)是满足要求的,l=0,r=5,

root:=handler(nums,0,len(nums)) root.Left=handler(nums,l,mid) root.Right=handler(nums,mid+1,r)

这样写才是对的,同样是mid=2,左子树是[0,2),右子树是[3,5)

本质上其实就是因为下标是从0开始,而len却是从1开始的,才会有这种区间。