经过昨日训练,中序遍历基本会了。所以这个就比较顺利,对二分查找树来说,中序遍历就是递增的。所以遍历一下,遇到反例返回false即可。
public class Solution {
public boolean isValidBST(TreeNode root) {
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode n = root;
int last = Integer.MIN_VALUE;
while (n != null || !stack.empty()) {
if (n != null) {
stack.push(n);
n = n.left;
}
else {
n = stack.pop();
// visit n
if (n.val <= last) return false;
last = n.val;
n = n.right;
}
}
return true;
}
}
另外一种递归解法见此:http://www.cnblogs.com/remlostime/archive/2012/11/16/2772629.html
递归判断,递归时传入两个参数,一个是左界,一个是右界,节点的值必须在两个界的中间,同时在判断做子树和右子树时更新左右界。
Python3,记录上一个visited的值,并递归
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
prev = [None]
return self.checkBST(root, prev)
def checkBST(self, root: TreeNode, prev: []) -> bool:
if root is None:
return True
if root.left is not None:
if not self.checkBST(root.left, prev):
return False
if prev[0] is not None and prev[0] >= root.val:
return False
prev[0] = root.val
if root.right is not None:
if not self.checkBST(root.right, prev):
return False
return True