二叉搜索树的定义
二叉搜索树
(BST)是二叉树的一种特殊表示形式,它满足如下特性:
- 每个节点中的值必须
大于
(或等于)存储在其左侧子树中的任何值。 - 每个节点中的值必须
小于
(或等于)存储在其右子树中的任何值。
下面是一个二叉搜索树的例子:
了解了二叉搜索树的概念之后,下面来看看我验证二叉搜索树的思路:
总体上,
定义的意思就是一个结点的左子树的任意一个数字都比该结点小,右子树的任意一个数字都比该结点大。缩小范围,
一个结点的左子树中最大的数字都比该结点小,一个结点的右子树中最小的数字都比该结点大。
结论:一个结点的左子树中最大的数字都比该结点小,一个结点的右子树中最小的数字都比该结点大。
求二叉树最大值
//root树为上面的例子
void max(TreeNode* root,int &t){
if(root){
if(t<root->val) t=root->val;
max(root->left,t);
max(root->right,t);
}
}
int t=root->val;
max(root,t);
求二叉树最小值
上面的那个函数稍作改动
void min(TreeNode* root,int &t){
if(root){
if(t>root->val) t=root->val;
min(root->left,t);
min(root->right,t);
}
}
int t=root->val;
min(root,t);
求左子树最大值和求右子树最小值
利用上面定义的函数可轻易实现这两个功能
int left(TreeNode* root){
int t=root->left->val;
max(root->left,t);
return t;
}
int right(TreeNode* root){
int t=root->right->val;
min(root->right,t);
return t;
}
上面两个函数已经完成了一半的工作,非常的重要,接下来就是遍历每一个结点,查看是否有左子树中最大值大于等于该结点或右子树最小值小于等于该结点的情况,如果有则将最外层的
res
的全局变量设为false
。最后遍历完之后返回res
遍历
//全局变量res=true
void order(TreeNode* root){
if(root){
if(root->left){
if(root->val<=left(root)) res=false;
}
if(root->right){
if(root->val>=right(root)) res=false;
}
order(root->left);
order(root->right);
}
}
完整代码
class Solution {
public:
int res=true;
int left(TreeNode* root){
int t=root->left->val;
max(root->left,t);
return t;
}
int right(TreeNode* root){
int t=root->right->val;
min(root->right,t);
return t;
}
void max(TreeNode* root,int &t){
if(root){
if(t<root->val) t=root->val;
max(root->left,t);
max(root->right,t);
}
}
void min(TreeNode* root,int &t){
if(root){
if(t>root->val) t=root->val;
min(root->left,t);
min(root->right,t);
}
}
void order(TreeNode* root){
if(root){
cout<<root->val<<" ";//输出该结点值
if(root->left){
cout<<left(root)<<" ";//输出左子树最大值
if(root->val<=left(root)) res=false;
}
if(root->right){
cout<<right(root)<<" ";//输出右子树最小值
if(root->val>=right(root)) res=false;
}
cout<<endl;//一个结点一行
//前面三个输出可以去掉,我为了直观的看运行过程才加上去的
order(root->left);
order(root->right);
}
}
bool isValidBST(TreeNode* root) {
order(root);
return res;
}
};
运行
用最上面的那个例子来测试