思路
- 这道题乍一看,觉得挺简单,但是有一个点比较容易忽略,例如下面这个用例
5
/ \
1 4
/ \
3 6
对于3这个节点,虽然满足小于4,但是作为5的右子树,其所有子节点都应该大于5,因此这棵树不是二叉搜索树。
- 很自然想到采用递归的方式
- 通过记录上下限的方式,保证子树上所有节点满足要求,递归至右子树时,更新下限,递归至左子树时更新上限。
- 最左节点和最右节点分别没有下限和上限,可以使用一个标记来表示,或者定义一个魔术字,本例中采用定义一个结构体的方式。
代码
#define True 1
#define False 0
#define UPPER 1
#define LOWER (-1)
typedef struct tag_Limit
{
char flag;
int limit;
}Limit;
bool RecursionJudge(struct TreeNode *root, Limit upper, Limit lower )
{
Limit upperLeft;
Limit lowerRitht;
if (!root) {
return True;
}
if (upper.flag == UPPER && root->val >= upper.limit)
return false;
if (lower.flag == LOWER && root->val <= lower.limit)
return false;
upperLeft.flag = UPPER;
upperLeft.limit = root->val;
lowerRitht.flag = LOWER;
lowerRitht.limit = root->val;
bool relt = RecursionJudge(root->left, upperLeft, lower) && RecursionJudge(root->right, upper, lowerRitht);
return relt;
}
bool isValidBST(struct TreeNode* root)
{
if(!root) {
return True;
}
Limit upper;
Limit lower;
upper.flag = 0;
upper.limit = 0;
lower.flag = 0;
lower.limit = 0;
return RecursionJudge(root, upper, lower);
}