leetcode--98. 验证二叉搜索树(dfs)

记录
13:50 2024-1-28

https://leetcode.cn/problems/validate-binary-search-tree/

想岔方向了,想的太复杂了。
首先思路是每个root节点必须大于左子树的最大节点,小于右边子树的最小节点。
我的做法是记录下叶子节点,因为左边叶子节点的集合(vector)的最后一个节点为左子树的最大值,同理右边边叶子节点的集合(vector)的第一个节点为右子树的最小值。

这么想太复杂了,主要问题是集中于root节点去判断左右子树,如果聚焦于左右子树可以明白,左子树的最大节点要小于root,右子树的最小节点要大于root。
基于以上原理可以表示为:

  • MIN < 左子树所有节点 < root->value
  • root->value < 右子树所有节点 < MAX
    我的思路
class Solution {
public:
    bool check(TreeNode* root, vector<int>& leaf) {
        if(root == nullptr) return true;

        if(root->left == nullptr && root->right == nullptr) {
            leaf.push_back(root->val);
            return true;
        }

        if(root->left !=nullptr && root->left->val >= root->val) return false;
        if(root->right !=nullptr && root->right->val <= root->val) return false;

        vector<int> lleaf, rleaf;

        if(root->left != nullptr && !check(root->left, lleaf)) return false;

        if(root->right != nullptr && !check(root->right, rleaf)) return false;

        if(!lleaf.empty() && lleaf.back() >= root->val) return false;
        if(!rleaf.empty() && rleaf.front() <= root->val) return false;

        leaf = lleaf;
        leaf.insert(leaf.end(), rleaf.begin(), rleaf.end());

        return true;
    }

    bool isValidBST(TreeNode* root) {
        vector<int> leaf;
        return check(root, leaf);
    }
}

leetcode上比较好的思路

class Solution {
public:
    bool check(TreeNode* root, long min, long max) {
        if(root == nullptr) return true;

        if(root->val <= min || root->val >= max) return false;

        return check(root->left, min, root->val) && check(root->right, root->val, max);
    }

    bool isValidBST(TreeNode* root) {
        return check(root, LONG_MIN, LONG_MAX);
    }
}
posted @ 2024-01-28 13:57  57one  阅读(4)  评论(0编辑  收藏  举报