输入: 二叉树根节点 root。
要求: 判断该树是否为有效二叉搜索树(BST)。
- 任意节点:左子树所有值 严格小于 它,右子树所有值 严格大于 它。
- 左右子树本身也必须是 BST。
输出: true / false。
思路:
BST 的核心性质可以用一句话“降维”成数组问题:
BST 的中序遍历结果必须是严格递增序列。
所以我们做一次中序遍历(左-根-右),并维护一个变量 prev 表示“上一个访问到的节点值”。
遍历到当前节点时:
- 若
node->val <= prev,说明出现了非递增(重复或逆序),直接判false。 - 否则更新
prev = node->val,继续遍历右子树。
细节:
prev用long long,初始化成LLONG_MIN,避免节点值可能等于INT_MIN时出错。
复杂度:
- 时间复杂度:O(N)
- 空间复杂度:O(H)(递归栈深度,H 为树高)
class Solution {
public:
bool isValidBST(TreeNode* root) {
long long prev = LLONG_MIN;
return inorderCheck(root, prev);
}
private:
bool inorderCheck(TreeNode* node, long long& prev) {
if (!node) return true;
if (!inorderCheck(node->left, prev)) return false;
if ((long long)node->val <= prev) return false;
prev = node->val;
return inorderCheck(node->right, prev);
}
};
844

被折叠的 条评论
为什么被折叠?



