You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode 938:两种单行递归解法差异及失效原因咨询

LeetCode 938 范围和二叉搜索树:两种单行递归解法的差异与失效原因

两种解法代码

第一种通过测试的单行递归解法:

return root == null ? 0 : root.val < low || root.val > high ? RangeSumBST(root.left, low, high) + RangeSumBST(root.right, low, high) : RangeSumBST(root.left, low, high) + RangeSumBST(root.right, low, high) + root.val;

第二种尝试简化但失效的解法:

return root == null ? 0 : RangeSumBST(root.left, low, high) + RangeSumBST(root.right, low, high) + root.val < low || root.val > high ? 0 : root.val;

差异与失效原因

问题核心是运算符优先级导致的逻辑解析错误:

  1. 第一种解法逻辑符合预期:

    • 节点为空时返回0;
    • 当前节点值不在[low, high]范围内时,仅返回左右子树的范围和;
    • 当前节点值在范围内时,返回左右子树的范围和加上当前节点值。
  2. 第二种解法因运算符优先级(+优先级高于</>,</>优先级高于||,三元运算符?:优先级最低),实际执行逻辑完全偏离预期:
    代码被解析为:

    return root == null ? 0 : ((RangeSumBST(root.left, low, high) + RangeSumBST(root.right, low, high) + root.val) < low || root.val > high) ? 0 : root.val;
    

    也就是先计算左右子树和加当前节点值的总和,再判断「这个总和小于low」或者「当前节点值大于high」,满足则返回0,否则返回当前节点值。这导致左右子树的递归结果被错误丢弃,最终只会返回根节点值(或0),完全没有累加子树的有效和。

修复第二种解法

给判断当前节点值范围的三元表达式加上括号,强制优先执行该逻辑,再与左右子树的和相加:

return root == null ? 0 : RangeSumBST(root.left, low, high) + RangeSumBST(root.right, low, high) + (root.val < low || root.val > high ? 0 : root.val);

内容的提问来源于stack exchange,提问作者Liu_064

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 07:55:34