二叉搜索树范围节点和递归函数疑问及递归学习资源求助
二叉搜索树范围和递归问题解答
示例代码
var rangeSumBST = function(root, low, high) { let sum=0; if(root){ sum+=(root.val>=low&&root.val<=high)?root.val:0; sum+=rangeSumBST(root.left,low,high); sum+=rangeSumBST(root.right,low,high); } return sum; };
这是一个计算二叉搜索树中指定区间节点值总和的函数。
关于递归中sum初始化的疑问
每次递归调用时sum被初始化为0完全没问题,原因很直接:
- 每一次递归调用都是独立的函数执行实例,每个实例里的
sum都是全新的变量,互相不会影响。 - 当前函数的
sum会先计算当前节点的贡献(符合区间就加节点值,否则加0),再加上左子树递归返回的总和,再加上右子树递归返回的总和,最后把这个结果返回给上一层调用。 - 举个小例子:如果当前是符合条件的叶子节点,它的
sum初始为0,加上自身值后变成对应数,左右子树都是null,递归返回0,最终这个数会被返回给父节点,父节点把它加到自己的sum里,层层汇总后就得到整棵树的结果。
此处递归的核心逻辑
这个递归本质是后序遍历的变种,执行流程是:
- 先判断当前节点是否存在,不存在直接返回0。
- 计算当前节点的贡献值。
- 递归遍历左子树,获取左子树的符合区间总和。
- 递归遍历右子树,获取右子树的符合区间总和。
- 将当前节点贡献、左子树总和、右子树总和相加,返回给上层调用。
终止条件就是节点为null,此时没有节点值可以贡献,返回0。
递归学习建议
- 先啃基础:抓住递归的两个核心——终止条件和递归步骤,从简单问题练手(比如阶乘、求数组和)。
- 结合树结构练习:二叉树的三种遍历(前序、中序、后序)是递归的经典场景,多写几遍就能摸透递归在树里的执行路径。
- 手动推演流程:拿一个小型二叉树代入你的代码,一步步写出每个递归调用的
sum值和返回结果,直观感受递归的栈式执行过程。
内容的提问来源于stack exchange,提问作者itri123
相关产品推荐
相关产品推荐

