题目
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
递归
二叉搜索树的特性:该二叉树的左子树不为空,则左子树上的所有节点均小于根节点的值;若二叉树的右子树不为空,则右子树的所有节点均大于根节点的值。可以通过递归的方式递归判断。
# 时间复杂度:O(N)
# 空间复杂度:O(N)
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
def bijiao(root, left, right):
if not root:
return True
val = root.val
# 确保val在left与right的开区间内
if val<=left or val>=right:
return False
# 判断左子树的节点,要注意此时最大值已经变成了val
if not bijiao(root.left, left, val):
return False
# 右子树节点判断同理
if not bijiao(root.right, val, right):
return False
# 返回True
return True
return bijiao(root, float('-inf'), float('inf'))
中序遍历
递归实现
已知二叉搜索树的中序遍历得到的值一定是升序的,所以在中序遍历时检查当前节点是否大于前一个节点即可,可以首先构建中序遍历,之后在判断中间值时添加递归语句。
# 时间复杂度:O(N)
# 空间复杂度:O(N)
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
self.pre = None
def helper(root):
# 中止条件
if root == None:
return True
if helper(root.left) is False:
return False
# process logic in current level
if self.pre and self.pre.val >= root.val:
return False
self.pre = root
# drill down
if helper(root.right) is False:
return False
return True
return helper(root)
C++版本
class Solution {
public:
long long pre = LONG_MIN;
bool isValidBST(TreeNode* root) {
if (root == nullptr){
return true;
}
if (isValidBST(root->left) == false){
return false;
}
if (pre>=root->val){
return false;
}
pre = root->val;
if (isValidBST(root->right) == false){
return false;
}
return true;
}
};