98. 验证二叉搜索树

题目

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

  • 节点的左子树只包含小于当前节点的数。
  • 节点的右子树只包含大于当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

示例1:

给定二叉树 [3,9,20,null,null,15,7]

1
2
3
4
5
输入:
2
/ \
1 3
输出: true

示例2:

1
2
3
4
5
6
7
8
9
10
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4

解法

解法一:

递归求解

验证当前节点是否都大于其左子树下的所有节点以及是否都小于其右子树下的所有节点

Java

1
2
3
4
5
6
7
8
9
public int maxDepth(TreeNode root) {
if (null == root) {
return 0;
}

int dl = maxDepth(root.left) + 1;
int dr = maxDepth(root.right) + 1;
return dl > dr ? dl : dr;
}

解法二:

借助栈

我们还可以在栈的帮助下将上面的递归转换为迭代。

使用 DFS 策略访问每个结点,同时在每次访问时更新最大深度。

所以我们从包含根结点且相应深度为 1 的栈开始。然后我们继续迭代:将当前结点弹出栈并推入子结点。每一步都会更新深度.

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public int maxDepth(TreeNode root) {
Queue<Pair<TreeNode, Integer>> stack = new LinkedList<>();
if (root != null) {
stack.add(new Pair(root, 1));
}

int depth = 0;
while (!stack.isEmpty()) {
Pair<TreeNode, Integer> current = stack.poll();
root = current.getKey();
int current_depth = current.getValue();
if (root != null) {
depth = Math.max(depth, current_depth);
stack.add(new Pair(root.left, current_depth + 1));
stack.add(new Pair(root.right, current_depth + 1));
}
}
return depth;
}
0%