给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
提示:
- 树中节点数目范围在
[1, 104]
内 -231 <= Node.val <= 231 - 1
解题思路:二叉搜索树的特点在于 二叉搜索树通过中序遍历所遍历的节点的 val 值是单调递增的,所以我们可以将所给树经过中序遍历判断其是不是递增的判断其是否为二叉搜索树。
我们也可以在中序遍历的过程当中进行判断。需要使用一个变量记录上一个节点的val值。代码分递归法和迭代法。
代码和提交结果如下:
递归:
Class Solution {
long pre = -Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
if(root == null){
return true;
}
boolean l = isValidBST(root.left);
if(root.val > pre){
pre = root.val;
}else{
return false;
}
boolean r = isValidBST(root.right);
if(l && r){
return true;
}else{
return false;
}
}
}
迭代:
Class Solution {
public boolean isValidBST(TreeNode root) {
long pre = -Long.MIN_VALUE;
if(root == null){
return true;
}
Stack<TreeNode> stack = new Stack();
stack.push(root);
while(!stack.isEmpty()){
TreeNode node = stack.pop();
if(node != null){
if(node.right != null){
stack.push(node.right);
}
stack.push(node);
stack.push(null);
if(node.left != null){
stack.push(node.left);
}
}else{
node = stack.pop();
if(node.val > pre){
pre = node.val;
}else{
return false;
}
}
}
return true;
}
}
总结: 对于二叉搜索树的题目,我们需要知道的就是如果一个树是二叉搜索树,那么经过中序遍历之后,他的结果一定是单调递增的。可以利用这一点解题。