当前位置: 首页 > 知识库问答 >
问题:

使用DFS的BST范围和

濮阳烨然
2023-03-14

问题:给定二叉查找树的根节点,返回值在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;
    }
}

共有2个答案

公羊俊
2023-03-14

您在末尾添加这些值并使用返回值的方法是正确的。(在使用指针算术或通过引用变量传递的语言中,可以将引用传递给整数并增加接收值,而无需返回值。)但在使用“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;
    }
庾君博
2023-03-14

两个问题:

>

  • 当值在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相关联的原型(如果不是),以便每次都可以生成单独的实例