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