【Day-33慢就是快】代码随想录-二叉树-验证二叉搜索树

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

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

思路


关键是知道中序遍历下二叉搜索树是递增序列。

先中序遍历,再判断是否为递增序列即可。

递归法

先将搜索树转换为数组:

vector vec;
    void traversal(TreeNode* root){
        if(root == NULL) return;
        traversal(root->left);
        vec.push_back(root->val);
        traversal(root->right);
    }

然后进行比较,是否为有序数组。注意:二叉搜索树中不能有重复元素!

traversal(root);
        for(int i = 1;i < vec.size(); i++){
            if(vec[i] <= vec[i-1]) return false;
        }
        return true;

代码如下:

class Solution {
public:
    vector vec;
    void traversal(TreeNode* root){
        if(root == NULL) return;
        traversal(root->left);
        vec.push_back(root->val);
        traversal(root->right);
    }
    bool isValidBST(TreeNode* root) {
        traversal(root);
        for(int i = 1;i < vec.size(); i++){
            if(vec[i] <= vec[i-1]) return false;
        }
        return true;
    }
};

方法2:

在中序遍历的时候比较大小。

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;
    }
};

迭代法

对中序遍历稍加改动:

class Solution {
public:
    bool isValidBST(TreeNode* root) {
        stack st;
        TreeNode* cur = root;
        TreeNode* pre = NULL;
        while(cur != NULL || !st.empty()){
            if(cur != nullptr){
                st.push(cur);
                cur = cur->left;
            }
            else{
                cur = st.top();
                st.pop();
                if(pre != NULL && cur->val <= pre->val)
                    return false;
                pre = cur;
                cur = cur->right;
            }
        }
        return true;
    }
};

你可能感兴趣的:(代码随想录,c++,算法)