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

二叉树:最小值和最大值之间所有节点的总和

邢博文
2023-03-14

我有一个任务,给我一个随机生成的BST的根。我得到了随机生成的测试用例。

分配说明如下:

您将得到二叉搜索树的根节点T和两个整数:min和max。确定存储在T中大于或等于min且小于或等于max的所有键的总和。递归地实现算法

我不允许使用全局变量或创建辅助函数

我当前的代码是:

private static int problem2(Node root, int min, int max){

 if(root = null){
    return 0;
 }

 if(root.key < min || root.key > max){     
   int lft = problem2(root.left, min, max);
   int rgt = problem2(root.right, min, max);
   int sum = lft + rgt;
   return sum;
 }

}

我的问题是,如果在递归过程中的任何时候,节点都会触发基本情况,并导致我的函数无法正确完成。我相信我的命令可能是罪魁祸首。

分类的节点定义为:

private static class Node
{
    public Node left = null;
    public Node right = null;

    public int key;

    public Node(int key)
    {
        this.key = key;
    }
}

共有3个答案

芮朗
2023-03-14

由于它显然是出于教育目的的任务,因此我不会发布完整的解决方案,但是我会给出可能会有所帮助的提示:

基本上你做的一切都是对的,方法定义很好。

然而,该方法本身存在几个错误:

首先,这段代码:

if(root == null || root.key < min || root.key > max){
    return 0;
}

第一个条件是在你已经到达终点的情况下,好的。但是剩下的呢?某个节点小于“min”的事实是否意味着它的所有“子节点”也不能“贡献”到总和,并且必然“超出范围”?

免责声明:我在这里依赖于它是一棵二叉树的事实(如问题标题所写),所以我不假设元素的任何顺序。即使它是一棵二叉搜索树,我的评论仍然有效(想想为什么)。

现在,递归本身:

if(root.key < min || root.key > max){     
   int lft = problem2(root.left, min, max);
   int rgt = problem2(root.right, min, max);
   int sum = lft + rgt;
   return sum;
 }

你在这里所说的基本上是“如果我的当前根的键在[min,max]范围之外,那么进入递归”。相反,你应该说“如果我当前根的键在[min,max]范围内,那么进入递归”

请注意,由于我的第一个评论,此代码也可能会发生变化-只要留意角落情况

竺展
2023-03-14

我认为问题在于:

if(root == null || root.key < min || root.key > max){
    return 0;
 }

想象一下这种情况1:min:10,max:20,root.key:8,在这里这将直接返回0,但该根的右子节点上可能存在一些可能在可接受的范围内。

类似地,案例1:min: 10, max: 20,root.key:22,这里这将直接返回0,但可能在该根的左子节点上有一些节点可能在可接受的范围内。

您需要以这样的方式修改代码:如果<code>root.key

此外,代码中的两个< code>if条件是相同的,因此您的流永远不会进入第二个< code>if块的定义。

蒯安平
2023-03-14

这样想:当你到达一个不在期望范围内的节点时,你的算法停止。如果根本身超出范围会怎么样?你会立刻返回0。您需要修正您的退出条件,以便您的递归只在到达< code>null时停止,因为您无法知道在[min,max]范围内有多少节点出现在您当前所在节点的子树中。然后,在递归本身中,您应该决定是否将当前节点添加到总和中。

可能的实现-前面的剧透,我建议你只看你自己解决了它:

private static int problem2(Node root, int min, int max){

 if(root == null){
    return 0;
 }

 int sum = 0;
 // No point in keeping the recursion right/left if the current key is
 // larger/smaller than the desired range - usage of BST property:
 if (root.key <= max) {
    sum += problem2(root.right, min, max);
 }
 if (root.key >= min) {
    sum += problem2(root.left, min, max);
 }
 // If root is within range add it to sum:
 if (root.key <= max && root.key >= min){
    return root.key + sum;
 } else {
    return sum;
 }

}

说明:每个递归调用汇总了左右子树的结果。您当前所在的节点的键将添加到计算中,如果它在所需的 [min, max] 范围内。

 类似资料:
  • 我们想写一个函数,它将二叉树的根作为输入,并使用类PairAns返回该树的最大值和最小值。 我在这个问题的基础案例中遇到了一些问题 我希望答案是正确的,但在所有测试用例中都出现了运行时错误。

  • 如何计算二叉树中最小级别所有叶节点的总和。如果不存在树,则应返回-1。 例子: 对于上述二叉树,返回100(40 60) (图片来源:Geeksforgeks)

  • 我有以下BST供参考。英国夏令时 假设最小值:9 和最大值:20 它满足所有条件,对于每个节点 (X),左侧子树中的所有节点都小于,并且右侧子树中的所有节点都大于 X 的值。 我在创建打印所有值的函数(成员函数,因此它可以访问根节点)时遇到了问题。具体来说,假设我的当前节点是10,但是我仍然需要检查左右两边的子树。我不能在参数中传递节点(否则我会这样做?),所以我要实现这个功能 此外,函数应该只访

  • 本文向大家介绍手写代码:求全体二叉树节点最大值相关面试题,主要包含被问及手写代码:求全体二叉树节点最大值时的应答技巧和注意事项,需要的朋友参考一下 参考回答:  

  • 我有一个这样的数据帧: 必修的: 相关链接:pandas groupby的最小和最大行 pandas groupby中两个系列的最大值和最小值 pandas groupby中的最大和最小日期 单击groupby,然后按列的值(例如,最小值、最大值)选择一行

  • 我试图递归地在二叉树中找到最小值(不是二叉查找树)。让我困惑的是基本情况。如果TreeNode t为空,返回什么?因为我将使用返回的值将其与当前的最小值进行比较(我认为),我相信我返回的内容很重要。