1 回答
TA贡献1856条经验 获得超5个赞
由于它是一个 BST,因此您可以使用 BST 的Inorder Morris 遍历在 O(1) 空间复杂度中完成,因此对于单个查询,除非您在树本身中有某种预处理,否则您无法比 O(N) 时间复杂度做得更好。您当前的实现正在使用堆栈,因此在最坏的情况下,您当前的空间复杂度为 O(N),此时树基本上是一条路径。
Go 中的实现(能够击败 99%):
func rangeSumBST(root *TreeNode, min int, max int) int {
if root == nil {
return 0
}
var pre *TreeNode
curr := root
sum := 0
for curr != nil {
if curr.Left == nil {
if curr.Val >= min && curr.Val <= max {
sum += curr.Val
}
if curr.Val > max {
break
}
curr = curr.Right
} else {
pre = curr.Left
for pre.Right != nil && pre.Right != curr {
pre = pre.Right
}
if pre.Right == nil {
pre.Right = curr
curr = curr.Left
} else {
pre.Right = nil
if curr.Val >= min && curr.Val <= max {
sum += curr.Val
}
if curr.Val > max {
break
}
curr = curr.Right
}
}
}
return sum
}
时间复杂度:O(节点数)
空间复杂度:O(1)
注意:不知何故,它并没有显示出内存性能的任何改进,可能是因为测试还不够,而且当测试不太大时,leetcode 会显示以前提交的解决方案的旧统计数据。
- 1 回答
- 0 关注
- 98 浏览
添加回答
举报