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;
差异与失效原因
问题核心是运算符优先级导致的逻辑解析错误:
第一种解法逻辑符合预期:
- 节点为空时返回0;
- 当前节点值不在
[low, high]范围内时,仅返回左右子树的范围和; - 当前节点值在范围内时,返回左右子树的范围和加上当前节点值。
第二种解法因运算符优先级(
+优先级高于</>,</>优先级高于||,三元运算符?:优先级最低),实际执行逻辑完全偏离预期:
代码被解析为: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
相关产品推荐
相关产品推荐

