你的代码实现的思路是通过中序遍历来验证二叉搜索树(BST)。但是,由于递归的方式,你可能在 isValid
函数中没有正确处理返回值,导致一些边界情况未被检查。
我们可以用一个简单的方法来修复这个代码:在进行中序遍历时,我们需要确保当前节点的值大于前一个节点的值。以下是修改后的代码:
class Solution {
public:
TreeNode* prev = nullptr; // 用于存储上一个访问的节点
bool isValid(TreeNode* node) {
if (!node) return true; // 空节点视为有效
// 递归检查左子树
if (!isValid(node->left)) return false;
// 检查当前节点与前一个节点的关系
if (prev && prev->val >= node->val) return false;
prev = node; // 更新上一个访问的节点
// 递归检查右子树
return isValid(node->right);
}
bool isValidBST(TreeNode* root) {
return isValid(root);
}
};
修改要点:
- 使用
prev
指针来跟踪上一个访问的节点,而不是使用vector<int> result
来保存所有值。 - 在每次中序遍历到当前节点时,检查
prev
和当前节点之间的大小关系。 - 如果有任何不符合 BST 条件的情况,则直接返回
false
。
这样可以确保在遍历过程中保持 O(n) 的时间复杂度和 O(h) 的空间复杂度(其中 h 是树的高度),并且避免了存储所有节点值所需的额外空间。
内容由零声教学AI助手提供,问题来源于学员提问