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

树:根到叶之和(递归)

闾丘康安
2023-03-14

问题是:计算所有根到叶数的总和。例如:如果树是(1,2,3),1是根,2是左子,3是右子,两条路径:1-

这是我正确的递归解决方案。在助手方法中,返回总和:

public int sumNumbers(TreeNode root) {
    if (root == null) {
        return 0;
    }
    return getSum(root, 0);
}
private int getSum(TreeNode root, int value) {
    if (root.left == null && root.right == null) {
        return root.val + value * 10;
    }
    int sum = 0;
    if (root.left != null) {
        sum += getSum(root.left, value * 10 + root.val);
    }
    if (root.right != null) {
        sum += getSum(root.right, value * 10 + root.val);
    }
    return sum;
}

但是当我在helper方法中添加sum作为参数时,我总是得到0。

public int getSum(TreeNode root) {
    int sum = 0, path = 0;
    helper(root, path, sum);
    return sum;
}
private void helper(TreeNode root, int path, int sum) {
    if (root == null) {
        return;
    }
    int path = 10 * path + root.val;
    if (root.left == null && root.right == null) {
        sum += path;
        return;
    }
    helper(root.left, path, sum);
    helper(root.right, path, sum);
}

我相信我对递归一定有一些误解。提前感谢您给我一些解释,为什么sum的值没有“转移”回getSum方法中的sum

共有2个答案

墨雨华
2023-03-14

ZouZou关于传递值的看法是正确的,尽管这只适用于原语。将求和改为整数而不是int应该可以做到这一点,另一个解决方案是给我们一个全局变量(即字段)

欧阳正卿
2023-03-14
Also you need to think about overflow. My solution has passed in LeetCode, hopefully it gives you some tips.


public class Solution {
    private long sum = 0;
    public int sumNumbers(TreeNode root) {
        if(root == null) return 0;
        sum(root, new Stack<Integer>());

        if(this.sum >= Integer.MAX_VALUE){
            return Integer.MAX_VALUE;
        }
        return (int)this.sum;
    }

    private void sum(TreeNode node, Stack<Integer> stack){
        if(node == null) return;
        stack.push(node.val);
        if(node.left == null && node.right == null){
            long tempSum = 0;
            int index = 0;
            for(int i=stack.size()-1;i>=0;i--){
                int k = stack.get(i);
                int times = (int)Math.pow(10, index++);
                k *= times;
                tempSum += k;
            }
            this.sum += tempSum;
        }

        sum(node.left, stack);
        sum(node.right, stack);
        if(stack.size() > 0) 
            stack.pop();
    }
}
 类似资料:
  • 我试图找到从根到叶的最小路径和,还需要计算最小路径。如果解决方案在左子树中,我的解决方案有效,但是如果结果在右子树中,根节点在结果路径中添加了两次,是否有人可以查看我的解决方案并帮助我修复此错误,如果有,还可以建议更好的运行时解决方案 我正在使用回溯访问所有节点,我认为我的解决方案的时间复杂度将是O(N)(因为所有节点都应该被访问,如果我错了,请纠正我)

  • 我试图搜索给定红黑树中所有根到叶的路径。特别是,我想编写一个测试,在给定rbt的情况下,该测试将断言每个路径具有相同数量的黑色节点。 我用两个全局变量尝试这样的东西: 然而,当左分支中的黑色节点右侧有红色节点时,我遇到了麻烦,因为这意味着计数比应该减少的更多。 有没有更好的方法来搜索根到叶的路径,计算特定值的频率,然后以某种方式比较计数?或者,如果给定rbt余额,是否有一种完全不同的方法来测试rb

  • 给定一棵二叉树,问题是找到所有根到叶的路径。我们通过以列表的形式传递路径,并在到达叶子时将其添加到结果中来了解算法。 我的问题是存储所有路径需要多少空间。我的直觉是,每条路径将消耗树高度(O(h))的内存顺序,如果我们的完整二叉树中有2*n-1个节点,那么每个节点对应于一条路径,因此假设树高度平衡,空间复杂度将为O(n*log(n))。我的分析正确吗?

  • 问题内容: 我试图使用Java在二叉树中打印所有根到叶的路径。 在主要方法中: 但是它给出了错误的输出。 给定的树: 预期产量: [5,1,3] [5、8、6] [5、8、9] 但是输出产生了: [5,1,3] [5、1、3、8、6] [5、1、3、8、6、9] 可以找出一个… 问题答案: 用以下方法调用递归方法: 传递时会发生什么(而不是在所有方法调用中使用单个对象,这意味着,当您返回原始调用者

  • 代码假设返回树中从根到叶的每条路径的列表,顺序从左到右。具有一个子节点(一个子节点(一个子节点)和一个子节点(一个子节点)不被视为叶节点。 我试着像这样编码 但返回的路径似乎包括具有一个子节点的节点。这将导致类似于

  • 我已经解决了很多与树相关的问题,但是,我仍然对树的一个特定方面(通常是递归)没有信心: 如何将值从叶传播到根? 例如,假设我们有一个二叉树,其中我们必须找到具有最小和的根到叶路径。对于此处的树图像,总和将为7(对应于两条路径0-3-2-1-1或0-6-1)。 我编写了以下代码: 我知道最后一次返回的货币不正确,但是我应该返回什么?从技术上讲,我只想在到达叶节点时返回minVal的值(在中间节点时没