这道题有两种思路:
1)利用二叉搜索树的性质,即:中序遍历为升序。
我们先求得中序遍历(递归or非递归),再判断是否为升序。
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def isValidBST(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
def zhongxu(root,result=[]):
if root==None:
return result
result=zhongxu(root.left)
result.append(root.val)
result=zhongxu(root.right)
return result
result=zhongxu(root)
return [result[i]<result[i+1] for i in range(0,len(result)-1)]==[True for i in range(0,len(result)-1)]
2)按照二叉搜索树的定义,左子树上的值都是小于根结点,右子树上的值都是大于根结点。
class Solution {
public:
bool isValidBST(TreeNode* root, long long min, long long max){
if(root== nullptr)return true;
if(root->val > min && root->val < max){
return isValidBST(root->left, min, root->val) && isValidBST(root->right, root->val, max);
}
else{
return false;
}
}
bool isValidBST(TreeNode* root) {
return isValidBST(root, LLONG_MIN, LLONG_MAX);
}
};```
3)我一开写的只考虑了左中右判断,没有考虑根结点大小的错误代码如下:(比如[10,5,15,null,null,6,20]测试用例过不了)
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def isValidBST(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
if root==None:
return True
if root.left!=None and root.left.val>=root.val:
return False
if root.right!=None and root.right.val<=root.val:
return False
return self.isValidBST(root.left) and self.isValidBST(root.right)