给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
思路:中序遍历的结果是从小到大排列,故采用中序遍历,对节点值进行比较,如果出现当前节点值小于前一个节点值则不是二叉搜索树。
class Solution {
boolean temp = true;
long min = Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
if(root == null ) return true;
LDR(root);
return temp;
}
public void LDR(TreeNode root) {
if(root == null || !temp) return; //!temp 代表已经不成立了 不需要递归了
LDR(root.left);
if(root.val > min) {
min = root.val;
}else {
temp = false;
return; //已经不成立 不需要在递归
}
LDR(root.right);
}
}
不适用递归,中序遍历
class Solution {
public boolean isValidBST(TreeNode root) {
Stack<TreeNode> st=new Stack<TreeNode>();
long min=Long.MIN_VALUE;
while(!st.isEmpty() || root!=null)
{
while(root!=null)
{
st.push(root);
root=root.left;
}
root=st.pop();
if(root.val <= min) return false;
min=root.val;
root=root.right;
}
return true;
}
}