版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aFeiOnePiece/article/details/47749929
解题思路:
1,二叉搜索树有一个特点,就是 in-order traversal 是一个递增的序列;
2,设置一个pre节点,记录前一个访问的node,采用中叙遍历,遍历到的节点跟pre比较val大小
public class Solution {
private TreeNode pre;
public boolean isValidBST(TreeNode root) {
pre = null;
return inorderTraversal(root);
}
private boolean inorderTraversal(TreeNode node){
if(node == null) return true;
if(inorderTraversal(node.left)){
if (pre != null && pre.val >= node.val) return false;
pre = node;
return inorderTraversal(node.right);
}
return false;
}
}
------------------------------------
另外一个解题思路,就是每一个node的val,要比其左边所有的val都大,比右边所有的val都小。
如此递归,给每一个node做上述判断,时间复杂度为O(n^2)
public class Solution {
public boolean isValidBST(TreeNode root) {
if (root == null) return true;
return isGreaterThan(root.right, root.val) &&
isSmallerThan(root.left, root.val) &&
isValidBST(root.right) &&
isValidBST(root.left);
}
private boolean isGreaterThan(TreeNode node, int val){
if(node == null) return true;
return node.val > val &&
isGreaterThan(node.left, val)&&
isGreaterThan(node.right, val);
}
private boolean isSmallerThan(TreeNode node, int val){
if (node == null) return true;
return node.val < val &&
isSmallerThan(node.left, val) &&
isSmallerThan(node.right, val);
}
}