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