题目大意:判断一棵树是否是二叉搜索树
分析:dfs。
方法一:二叉搜索树需要满足一个结点的左子树中的所有点都比他小,右子树中的所有点都比他大,并且它的左右子树也分别都是二叉搜索树。所以递归就需要两步,一是一直找到根节点左子树中的最大(最右)节点,并且判断根与最右结点&&根的左子树是不是二叉搜索树;二是一直找到根节点右子树中的最小(最左)结点,并且判断根与最左结点&&根的右子树是不是二叉搜索树。
方法二:中序遍历是否存在逆序对。
代码:
class Solution {
public:
bool isValidBST(TreeNode* root) {
if (!root) return true;
bool left = true, right = true;
TreeNode* p;
if (root->left) {
p = root->left;
while (p->right)
p = p->right;
left = p->val < root->val && isValidBST(root->left);
}
if (root->right) {
p = root->right;
while (p->left)
p = p->left;
right = p->val > root->val && isValidBST(root->right);
}
return left && right;
}
};
/**
* 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:
TreeNode *pre = NULL;
bool isValidBST(TreeNode* root) {
if(root == NULL) return true;
bool left = isValidBST(root->left);
if(pre != NULL && pre->val >= root->val) return false;
pre = root;
bool right = isValidBST(root->right);
return left && right;
}
};