二叉搜索树(Binary Search Tree,又称BST)。任意一个节点的左子树的值一定小于根节点的值,右子树的值一定大于根节点的值。
二叉搜索树的中序变量递增!以Leetcode第98题为例:
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
class Solution {
private:
long long temp_val = LLONG_MIN;
long long now_val;
public:
bool isValidBST(TreeNode* root) {
if(root == NULL) return false;
stack<TreeNode*> st_tree;
while(!st_tree.empty() || root != NULL)
{
while(root != NULL)
{
st_tree.push(root);
root = root->left;
}
root = st_tree.top();
st_tree.pop();
now_val = root->val;
if(now_val <= temp_val)
return false;
else
temp_val = now_val;
root = root->right;
}
return true;
}
};
也可以使用递归实现,基本思想是:根节点的范围为[-INT_MIN,INT_MAX],值为val。则左节点的范围为[-INT_MIN,val-1],右节点的范围为[val+1,INT_MAX]。
class Solution {
public:
bool dfs(TreeNode* root,long long min_value,long long max_value)
{
if(root == NULL)
return true;
if(root->val < min_value || root->val > max_value)
return false;
// 1ll表示long long类型的1。root->val+1ll后,root->val会变成long long类型
return dfs(root->left,min_value,root->val-1ll) &&
dfs(root->right,root->val+1ll,max_value);
}
bool isValidBST(TreeNode* root) {
return dfs(root,LLONG_MIN,LLONG_MAX);
}
};