验证二叉搜索树

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

  • 节点的左子树只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

该题有一个很大的坑,即不能只判断一个子模式下根节点大于左孩子,小于右孩子。

正确的应该是根节点大于左子树全部节点,小于右子树全部节点。

正确的做法应该使用中序遍历,全局的查看遍历顺序是否是一个递增的序列

错误代码:


class Solution {
public:
    bool isValidBST(TreeNode* root) {
        if (root == nullptr) return true;
        int flag = 1;
        if (root->left && root->left->val >= root->val) flag = 0;
        else if (root->right && root->right->val <= root->val) flag = 0;
        if (flag) return isValidBST(root->left) && isValidBST(root->right);
        else return false;
    }
};
正确代码:

class Solution {
public:
    vector path;
    void traversal(TreeNode* root){
        if (root == nullptr) return ;
        traversal(root->left);
        path.push_back(root->val);
        traversal(root->right);
    }

    bool isValidBST(TreeNode* root) {
        if (root == nullptr) return true;
        traversal(root);
        for(int i=0; i<path.size()-1; i++){ if (path[i] >= path[i+1]) return false;
        }
        return true;
    }
};