LeetCode 98 Validate Binary Search Tree
思路
解法1
对一个BST中序遍历,结果将是一个上升序列。首先想到的解法是,用一个变量pre记录前一次遍历的节点,然后比较前一次遍历的节点与目前遍历的节点之间的大小关系。
解法2
在遍历的过程中,每个节点的取值范围是有由其父节点或其祖先节点的值限定的。因此,只要在遍历的过程中维护好这个范围,每次检查当前节点是否满足此范围即可。
如果向左走,那么当前节点能取的最大值越来越小,则更新最大值。如果向右走,那么当前节点能取的最小值越来越大,更新最小值。
代码
解法1
class Solution {
public:
bool isValidBST(TreeNode* root) {
stack<TreeNode*> stk;
TreeNode *pre = nullptr;
while (root || !stk.empty()) {
while (root) {
stk.push(root);
root = root->left;
}
root = stk.top();
stk.pop();
if (pre && pre->val >= root->val) return false;
pre = root;
root = root->right;
}
return true;
}
};
解法2
class Solution {
public:
bool isValidBST(TreeNode* root) {
return isValidBST(root, nullptr, nullptr);
}
bool isValidBST(TreeNode *root, TreeNode *minNode, TreeNode *maxNode) {
if (!root) return true;
else if (minNode && root->val <= minNode->val || maxNode && root->val >= maxNode->val)
return false;
else return isValidBST(root->left, minNode, root) && isValidBST(root->right, root, maxNode);
}
};