这道题花了非常多的时间,得到一个宝贵教训,不用使用还没熟练掌握的方法。一开始贪图递归,然后卡在递归的边界条件上面。回头看来,使用递归的算法框架应该简单一下,方便使用者了解思路。
思路:需要判断左右子树是否BST以及根节点的值判断两部分,前者可用递归,后者利用递归遍历法计算最大最小值。
心得:不要轻易使用递归,除非你已经想的足够清楚了。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Checker {
public:
int findMax(TreeNode *root, int max)
{
if (!root) return max;
max = max > root->val ? max : root->val;
max = findMax(root->left, max);
max = findMax(root->right, max);
return max;
}
int findMin(TreeNode *root, int min)
{
if (!root) return min;
min = min < root->val ? min : root->val;
min = findMin(root->left, min);
min = findMin(root->right, min);
return min;
}
bool checkBST(TreeNode *root)
{
// write code here
if (!root) return true;
bool l = false, r = false;
int max = root->val - 1, min = root->val + 1;
if (!root->left) l = true;
else
{
max = findMax(root->left, max);
if (max < root->val && checkBST(root->left))
l = true;
}
if (!root->right) r = true;
else
{
min = findMin(root->right, min);
if (min > root->val && checkBST(root->right))
r = true;
}
return l && r;
}
};
然后觉得这个算法有点蠢,去看了大神的算法,中序遍历!!!
简直是醍醐灌顶!太精彩了!详情参见:http://blog.csdn.net/zdplife/article/details/493848254825