LeetCode 98. 验证二叉搜索树

题目描述

🔥 98. 验证二叉搜索树

image-20230305213733014

image-20230305213737260

思路分析

中序遍历为升序

  1. 使用一个栈来模拟中序遍历。
  2. 初始化一个变量 pre,用于记录前一个节点的值。
  3. 遍历二叉树,将左子树的节点依次压入栈中。
  4. 弹出栈顶节点,比较当前节点的值和 pre 的值。
  5. 如果当前节点的值小于等于 pre 的值,则返回 false
  6. 否则,更新 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)
}

🍏 点击查看 Java 题解

1
write your code here
本文作者:
本文链接: https://hgnulb.github.io/blog/2023/83568790
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!