给定一个二叉树,判断其是否是一个有效的二叉搜索树。
一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
关键信息
1二叉搜索树的中序遍历是递增的,我们采用递归的到其中序变量结果
2不能采用全局变量,则需考虑递归函数中信息的传递
递归函数是一个函数(废话),函数则有 名,参数,返回值
所以需考虑利用参数或返回值完成本题
本人愚钝,起先只考虑了利用参数i传递中序前驱,用于比较其中序前驱与当前节点的大小关系,参数i在作为中序前驱的同时肩负着判断该树是否为二叉搜索树的信息(本文中将其称为重要信息)
利用返回值获得中序前驱,
/**
*Definition for a binary tree node.
*struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution
{
public:
//int最小值 -2147483648
//用-2147483650 作为 不是二叉搜索树的信息
double ValidBST(TreeNode* root,double i=-2147483649)
{
//时刻警惕着,判断i是否携带重要信息
if(root && i != -2147483650){
if( root ->left)
i = ValidBST( root ->left,i );
//时刻警惕着,判断刚从左子树的到的I 是否携带重要信息
if(i == -2147483650)
return -2147483650;
if(i < root->val )
i = root->val;
else
return -2147483650; //重要信息的诞生地
i = ValidBST( root ->right,i );
}
return i;
}
bool isValidBST( TreeNode* root )
{
int ff;
ff = ValidBST(root);
if( ff == -2147483650)
return false;
else
return true;
}
};
一大牛朋友发给我的 大家可以参考下思路(可耻的盗了捂脸)
bool judge(struct TreeNode* root,long long *data)
{
if(root==NULL)
return true;
if(root->left!=NULL)
{
if(judge(root->left,data)==false)
return false;
}
if(root->val>*data)
*data=root->val;
else
return false;
if(root->right!=NULL)
{
if(judge(root->right,data)==false)
return false;
}
return true;
}
bool isValidBST(struct TreeNode* root) {
int i;
long long data=-214748364800;
return judge(root,&data);
}