LeetCode 98. 验证二叉搜索树
题目描述
思路分析
中序遍历为升序
- 使用一个栈来模拟中序遍历。
- 初始化一个变量
pre
,用于记录前一个节点的值。- 遍历二叉树,将左子树的节点依次压入栈中。
- 弹出栈顶节点,比较当前节点的值和
pre
的值。- 如果当前节点的值小于等于
pre
的值,则返回false
。- 否则,更新
pre
的值为当前节点的值,并继续遍历右子树。
参考代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
func isValidBST(root *TreeNode) bool {
if root == nil {
return true
}
var stack []*TreeNode
pre := math.MinInt64
for len(stack) > 0 || root != nil {
// 将左子树的节点依次压入栈中
for root != nil {
stack = append(stack, root)
root = root.Left
}
// 弹出栈顶节点
root = stack[len(stack)-1]
stack = stack[:len(stack)-1]
// 比较当前节点的值和 pre 的值
if root.Val <= pre {
return false
}
pre = root.Val
// 遍历右子树
root = root.Right
}
return true
}
- 时间复杂度:O (N),其中 N 是二叉树的节点数。我们需要遍历每个节点一次。
- 空间复杂度:O (N),在最坏情况下,栈的深度可能达到 N。
1
2
3
4
5
6
7
8
9
10
11
12
13
func isValidBST(root *TreeNode) bool {
return validate(root, math.MinInt64, math.MaxInt64)
}
func validate(node *TreeNode, low, high int) bool {
if node == nil {
return true
}
if node.Val <= low || node.Val >= high {
return false
}
return validate(node.Left, low, node.Val) && validate(node.Right, node.Val, high)
}
1
write your code here
CC BY-NC-SA 4.0
许可协议,转载请注明出处!
本博客所有文章除特别声明外,均采用