问题:给定二叉查找树的根节点,返回值在L和R(包括)之间的所有节点的值之和。
二叉搜索树保证具有唯一的值。
例1:
输入:root=[10,5,15,3,7,null,18],L=7,R=15
输出: 32
Leetcode问题:https://leetcode.com/problems/range-sum-of-bst/
我的方法是:我尝试执行dfs并访问每个节点,如果该节点上的值符合约束条件,那么我希望在递归函数中返回它。然后,我将所有值相加,并将其返回到我的主函数。
我仍然试图理解递归,我在这段代码中做错了什么(为什么它只返回10而不是32?)。
我试图从每个递归函数返回一个值,并在最后添加它——这样做有意义吗?
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int rangeSumBST(TreeNode root, int L, int R) {
if(root == null) {
return 0;
}
rangeBST(root, L, R);
return rangeBST(root, L, R);
}
public static int rangeBST(TreeNode root, int L, int R) {
if(root == null) {
return 0;
}
if(root.val >= L && root.val <= R) {
return root.val;
}
int x = rangeBST(root.left, L, R);
int y = rangeBST(root.right, L, R);
return x + y;
}
}
您在末尾添加这些值并使用返回值的方法是正确的。(在使用指针算术或通过引用变量传递的语言中,可以将引用传递给整数并增加接收值,而无需返回值。)但在使用“returnroot.val”时,您遇到了一个问题。
public int rangeSumBST(TreeNode root, int l, int r) {
if(root == null)
return 0;
// This is a problem because you are stopping with your recursive search
// if one value was found. This is the reason because it is returning 10 in your example
// if(root.val >= L && root.val <= R) return root.val;
int result = 0;
// So your looking at your node, if the value is in the range you want.
if (root.val >= l && root.val <= r)
result += root.val;
// Add the ranged summ of your left node
result += rangeSumBST(root.left, l, r);
// Add the ranged summ of your right node
result += rangeSumBST(root.right, l, r);
// And your done
return result;
}
两个问题:
>
当值在L-R范围之间时,该算法应更深入地重现,但返回当前节点自己的值时,不会再深入查看。
算法不应该总是需要访问每个节点,而是利用BST属性:它应该只在当前值不排除时在左侧子树中搜索,以便在该子树中找到任何范围内的值。
例如,如果当前节点的值为3,且L-R范围为(5,9),则进一步查看左子树是没有意义的,因为在左子树中,所有值都保证小于3,无论该子树有多大。
右子树也有类似的观察结果。
class Solution {
public int rangeSumBST(TreeNode root, int L, int R) {
if (root == null) return 0;
int val = 0;
if (root.val >= L && root.val <= R) val += root.val;
if (root.val < R) val += rangeSumBST(root.right, L, R);
if (root.val > L) val += rangeSumBST(root.left, L, R);
return val;
}
}
我正在练习算法,解决这个经典问题。有很多解决方案,我正在尝试使用Javascript解决它。我将发布问题和我下面的内容: 给定二叉查找树的根节点,返回值在L和R(包括)之间的所有节点的值之和。 二叉搜索树保证具有唯一的值。
我在android项目中使用Dagger2我有两个作用域:ActivityScope和FragmentScope我读了一些示例代码,他们说定义并使用ActivityScope,所以对象将在activity lifecycle中销毁。因为活动和片段有不同的生命周期,所以我们应该有两个作用域。 我的问题是:我是否需要做一些事情让代码知道,当我使用ActivityScope时,对象应该随活动生命周期一起
Gateway/Worker 的进程模型 特点: 从图上我们可以看出Gateway负责接收客户端的连接以及连接上的数据,然后Worker接收Gateway发来的数据做处理,然后再经由Gateway把结果转发给其它客户端。每个客户端都有很多的路由到达另外一个客户端,例如client⑦与client①可以经由蓝色路径完成数据通讯 优点: 1、可以方便的实现客户端之间的通讯 2、Gateway与Work
本文向大家介绍Nginx 应用范围和使用详解,包括了Nginx 应用范围和使用详解的使用技巧和注意事项,需要的朋友参考一下 Nginx 应用详解 前言 本文只针对Nginx在不加载第三方模块的情况能处理哪些事情,由于第三方模块太多所以也介绍不完,当然本文本身也可能介绍的不完整,毕竟只是我个人使用过和了解到过得。所以还请见谅,同时欢迎留言交流 Nginx能做什么 1.反向代理 2.负载均衡 3.HT
我是一个角度开发人员和新的反应,这是简单的反应组件,但不工作 错误:在JSX作用域中使用JSX React/React时,“React”必须在作用域中
我只想了解@kafkaListener的范围是什么,原型还是单例。在单个主题的多个消费者的情况下,返回的是单个实例还是多个实例。在我的情况下,我有多个客户订阅单个主题并获得报告。我只是想知道如果 > 多个客户希望同时查询报告。在我的例子中,我在成功使用消息后关闭容器,但同时如果其他人想要获取报告,则容器应该打开。 如何将作用域更改为与容器的id相关联的原型(如果不是),以便每次都可以生成单独的实例