98. 验证二叉搜索树
问题98 验证二叉搜索树
https://leetcode-cn.com/problems/validate-binary-search-tree/
如何判断一颗二叉树是不是BST呢?根据BST的定义,本质上就是判断这颗二叉树的中序遍历是不是递增的。如果是递增的,那说明这是一颗BST,如果不是递增的,则说明这不是一颗有效的BST。既然如此,那就中序遍历就可以了,笨一点的办法是将中序遍历的结果存储到一个list或stack中,无论是递归还是非递归,然后判断list或stack中元素的顺序是否符合要求。那么能不能在遍历过程中动态检查元素大小关系,从而判定是否有效的BST呢?也可以的,只不过稍微麻烦点。至于官方题解里的递归写法,确实简洁,抽时间再写一下。
使用递归:
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
32
33
34
35
public boolean isValidBST(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
return inOrder(root, stack);
}
private boolean inOrder(TreeNode node, Stack<TreeNode> stack) {
if (node == null) {
return true;
}
if (node.left != null) {
boolean ret = inOrder(node.left, stack);
if (!ret) {
return false;
}
}
if (!stack.isEmpty()) {
TreeNode last = stack.peek();
if (node.val <= last.val) {
return false;
}
}
stack.add(node);
if (node.right != null) {
boolean ret = inOrder(node.right, stack);
if (!ret) {
return false;
}
}
return true;
}
不使用递归:
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
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}
Stack<TreeNode> stack = new Stack<>();
TreeNode node = root;
TreeNode prev = null;
while (node != null
|| !stack.isEmpty()) {
while (node != null) {
stack.push(node);
node = node.left;
}
TreeNode cur = stack.pop();
if (prev != null && cur.val <= prev.val) {
return false;
}
prev = cur;
if (cur.right != null) {
node = cur.right;
}
}
return true;
}
本文由作者按照 CC BY 4.0 进行授权