【问题标题】:Calculate the Path Sum in a Binary Tree计算二叉树中的路径和
【发布时间】:2017-08-19 15:28:50
【问题描述】:

试图计算从二叉树的根到叶子的路径和。似乎不起作用,dosIt 的值变为 true,但由于它是递归的,它在堆栈弹出时切换回 false。不知道如何修复它。 如何更改我的代码,以便一旦 doesIt 的值更改为 true,它就会一直向上传播?

考虑树:[5,4,8,11,null,null,null,7,2] InOrder

所以 5 有两个孩子 4 和 8,4 有 1 个孩子 11,8 没有孩子

hasPathSum(root,22)

public boolean hasPathSum(TreeNode root, int sum) {
    boolean doesIt = false;
    if (root != null)
    {
        doesIt = pathSum(root, sum, 0, doesIt);
    }
    return doesIt;
}

private static boolean pathSum(TreeNode root, int sum, int sumSoFar, boolean doesIt)
{
    if (root.left == null && root.right == null)
    {
        if (sumSoFar+root.val == sum)
        {
            doesIt = true;
            return doesIt;
        }
        return doesIt;
    }

    if (root.left != null)
    {
        pathSum(root.left, sum, sumSoFar+root.val,doesIt);
    }

    if (root.right != null)
    {
        pathSum(root.right, sum, sumSoFar+root.val,doesIt);
    }

    return doesIt;
}

【问题讨论】:

  • 7 和 2 怎么样。画一棵树并更新答案。
  • pathSum 递归调用自身时,内部pathSum 调用会返回一个值,但您不使用它。您只需要修复您的方法,以便它使用这些返回值。不过,我不知道怎么做,因为我不明白该方法应该做什么。

标签: java recursion data-structures binary-tree


【解决方案1】:

你只是把调用方法给定的值扔给孩子。我将您的代码稍微重写为:

private static boolean pathSum(TreeNode root, final int sum, int sumSoFar) {
    if (root == null) return false;
    if (root.left == null && root.right == null) return sumSoFar + root.val == sum;
    return pathSum(root.left, sum, sumSoFar + root.val) || pathSum(root.right, sum, sumSoFar + root.val);
}

这是基本递归:对于null 节点的答案定义为假,叶子是另一种极端情况,一般情况下试图在两个分支之一中取得成功。

附:从问题和方法签名中不清楚您要实现什么,但我想您使用给定的sum 路径总和检查是否存在从根到任何叶子的路径

【讨论】:

    猜你喜欢
    • 2020-11-29
    • 2016-09-07
    • 1970-01-01
    • 2018-08-10
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多