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 關注
- 119 瀏覽
添加回答
舉報