ZBLOG

class Solution { public: vector result; bool isValid(TreeNode* node) { if(!node) return true; isValid(node->left); if(result.size() > 0) { if(result[result.size() - 1] >= node->val) retu...

你的代码实现的思路是通过中序遍历来验证二叉搜索树(BST)。但是,由于递归的方式,你可能在 isValid 函数中没有正确处理返回值,导致一些边界情况未被检查。

我们可以用一个简单的方法来修复这个代码:在进行中序遍历时,我们需要确保当前节点的值大于前一个节点的值。以下是修改后的代码:

  1. class Solution {
  2. public:
  3. TreeNode* prev = nullptr; // 用于存储上一个访问的节点
  4. bool isValid(TreeNode* node) {
  5. if (!node) return true; // 空节点视为有效
  6. // 递归检查左子树
  7. if (!isValid(node->left)) return false;
  8. // 检查当前节点与前一个节点的关系
  9. if (prev && prev->val >= node->val) return false;
  10. prev = node; // 更新上一个访问的节点
  11. // 递归检查右子树
  12. return isValid(node->right);
  13. }
  14. bool isValidBST(TreeNode* root) {
  15. return isValid(root);
  16. }
  17. };

修改要点:

  1. 使用 prev 指针来跟踪上一个访问的节点,而不是使用 vector<int> result 来保存所有值。
  2. 在每次中序遍历到当前节点时,检查 prev 和当前节点之间的大小关系。
  3. 如果有任何不符合 BST 条件的情况,则直接返回 false

这样可以确保在遍历过程中保持 O(n) 的时间复杂度和 O(h) 的空间复杂度(其中 h 是树的高度),并且避免了存储所有节点值所需的额外空间。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=22599

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?