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

二叉树路径和问题中的递归逻辑输出错误

姚和顺
2023-03-14

我正在尝试使用Leetcode中的递归来解决路径和问题。我不擅长用递归解决问题。我看到了一些其他的解决方案,但我试图自己实现一个。我不明白我在我的方法中做错了什么。如果有人帮助我理解我做错了什么,我将非常感谢你的帮助。提前谢谢。

问题陈述:给定二叉树的根和整数targetSum,如果树有根到叶的路径,则返回true,这样沿路径的所有值相加等于targetSum。

叶是没有子节点的节点。

class Solution {
    public boolean hasPathSum(TreeNode root, int targetSum) {
        if(checkSum(root, targetSum) == 1) return true;
        return false;
    }
    
    public int checkSum(TreeNode root, int targetSum){
        if(root == null) return 0;
        if(root.left != null){
           // Assuming my checkSum() function already works, I want to get the left tree sum
            int left = checkSum(root.left, targetSum-root.val);
            // Adding the root value to the left tree sum to check if it equals to targetSum
            // If it matches, it returns 1
            if(left+root.val == targetSum){
                return 1;
            };
        }
        if(root.right != null){
           // Assuming my checkSum() function already works, I want to get the right tree sum
            int right = checkSum(root.right, targetSum-root.val);
            // Adding the root value to the right tree sum to check if it equals to targetSum
            // If it matches, it returns 1
            if(right+root.val == targetSum){
                return 1;
            };
        }
        // When everything above, does not match, it returns 0
        return 0;
    }
}

我的方法:我在研究递归时读到的是,你必须相信你的函数是有效的。因此,相信我假设调用校验和(root.left,targetSum-root.val)应该返回左子树的和。之后,我添加根。val向左求和,并检查它是否等于targetSum。我对正确的子树也做了同样的事情。我的函数当前输出错误。有人能帮我理解我在哪里用例子做错了吗。提前感谢你的帮助。

共有1个答案

段干开宇
2023-03-14

代码的关键问题是,您实际上没有涵盖基本场景。根据您的代码,当我们到达一个叶子时,我们只返回0。您根本不考虑targetSum变量。想想看。想象一个非常简单的例子,在这个例子中,你有一个根,有两个子元素,它们的值分别为10、5、20和targetSum=30。此输入的答案应为true,但函数将返回false,因为它只是忽略堆栈底部的targetSum(换句话说,基本情况)。

因此,对基本情况的检查可能如下所示:

if (root.left == null && root.right == null) {
    //some logic 
}

从基本检查,如果语句

if(left+root.val == targetSum){
   return 1;
};
if(right+root.val == targetSum){
   return 1;
};

不正确,因为您的左/右是检查和的结果,它只返回1或0。将其添加到root.val中是没有意义的,因为它并不意味着某个叶子的总和。我会把第一个if语句替换为

if (left == 1) {
    return 1;
} 

第二个if语句也应该这样做。我希望这会对你有所帮助。

 类似资料:
  • 我试图用python写一个递归函数,给定一个二叉树,一个节点返回一个包含节点方向的字符串。我已经接近了,但是我的最终返回语句给了我路径和节点(我不需要节点)即LRLR4。 这是我到目前为止的代码: 有没有一种方法可以在不使用字符串输出末尾的节点的情况下实现这一点? 编辑:添加了所有实际代码,并且有问题的树包含每个节点的单个字母字符串。

  • 这就是问题所在: 给定一棵二叉树,求最大路径和。 对于这个问题,路径被定义为沿着父子连接从某个起始节点到树中任何节点的任何节点序列。路径必须至少包含一个节点,并且不需要通过根。 例如:给定下面的二叉树, 返回6。 此问题的递归解决方案如下所示: 我们为左子调用< code>helper,并检查左子是否大于零。 然后,我们为右孩子调用< code>helper,并检查右孩子是否大于零。 然后我们检查

  • 我尝试使用递归遍历二叉树。每个树要么有两个子树,要么没有子树(即,为子树保留的字段==无) 我想将每个分支(即两个子节点==无的每个节点)的最后叶子添加到一个列表中,并返回该列表。我使用“搜索”功能和助手“搜索库”功能来实现这一点。 通过调试器,我看到“search”函数中的列表确实包含我希望它显示的元素。但是,当它在search_base函数中返回时,结果似乎是一个空列表。 我非常困惑,如果有任

  • 由于它是一种递归方法,我无法弄清楚如何使用这些stg参数来存储树元素数据。我希望将stg保留在那里,以便学习如何将字符串数据存储在递归方法中。我该怎么做呢?(基本上我想摆脱诱惑1) 编辑:我尝试了stg+=root.getElement()+“”;带返回STG;但这并不奏效 输出示例“树的顺序遍历:1 2 3 X Y Z X Y Z”

  • 有一个关于二叉树的基本java示例的问题:给定一个二叉树,查找路径中节点和等于给定目标数的所有路径。(有效路径是从根节点到任何叶节点。)。为什么我们需要

  • 主要内容:递归实现,非递归实现二叉树中序遍历的实现思想是: 访问当前节点的左子树; 访问根节点; 访问当前节点的右子树; 图 1 二叉树   以图  1 为例,采用中序遍历的思想遍历该二叉树的过程为: 访问该二叉树的根节点,找到 1; 遍历节点 1 的左子树,找到节点 2; 遍历节点 2 的左子树,找到节点 4; 由于节点 4 无左孩子,因此找到节点 4,并遍历节点 4 的右子树; 由于节点 4 无右子树,因此节点 2 的左子