【问题标题】:Why "res" does not change in my DFS function?为什么我的 DFS 函数中的“res”没有改变?
【发布时间】:2019-01-06 02:03:22
【问题描述】:

我有以下代码用于计算树的深度:

class Solution {
    public int maxDepth(TreeNode root) {
        int res = 0;
        DFS(root, res, 1);
        return res;
    }
    private void DFS(TreeNode root, int res, int curDepth) {
        if (root == null) {
            return; 
        }

        if (curDepth > res) {
            res = curDepth;
        }
        DFS(root.left, res, curDepth + 1);
        DFS(root.right, res, curDepth + 1);
    }
}

如果我给它输入[3, 9, 20, null, null, 15, 7],我希望res 等于3,因为它代表二叉树的深度。但是res 最终等于零。似乎从未改变。

有人知道为什么吗?

【问题讨论】:

    标签: java recursion binary-tree depth-first-search pass-by-value


    【解决方案1】:

    请记住,在您使用的语言(我认为是 Java?)中,函数的参数是按值传递的。这意味着当你写的时候

    DFS(root, res, 1)
    

    您实际上并没有将变量res 交给DFS 函数进行修改。相反,您是在说“复制恰好存储在名为res 的变量中的任何值,然后将该副本交给DFS。”

    方法 DFS 有一个名为 res 的参数,但事实上它名为 res 并且您在 maxDepth 中有自己的名为 res 的变量并不意味着这些值是相互关联的。举个例子,我曾经教过我班,有六个学生都叫佐伊(真实故事!)虽然他们都叫佐伊,但他们绝对不是同一个人!我不能和一个叫佐伊的人交谈,并期望所有其他佐伊都对我们谈论的内容有所了解。同样,maxDepth 中的res 变量与DFS 中的res 变量完全分开。巧合的是,他们的名字相同,但他们不是同一个人。

    有很多方法可以解决这个问题,可能最好的方法是让DFS 返回一个值给你,然后像这样编写你的代码:

    public int maxDepth(TreeNode root) {
        return DFS(root, 1);
    }
    
    private int DFS(TreeNode root, int currDepth) {
        // For you to figure out!
    }
    

    从函数返回值是从一种方法中获取信息并进入另一种方法的首选方式。所以现在您需要做的是考虑您希望从 DFS 返回什么值,以及您需要对其进行哪些更新才能使该信息正确传播。

    【讨论】:

    • 哇,非常感谢!你的解释太棒了。
    【解决方案2】:

    如果要计算节点的高度,只需将左右树的高度最大值加一即可。如果一个节点不存在,它就没有高度。

    private int height(TreeNode node) {
        if (node == null) {
            return 0;
        }
        return 1 + Math.max(height(node.left), height(node.right));
    }
    

    您的解决方案不起作用的原因是res 的值是按templatetypedef 所说的值传递的。

    其实你不需要一个带深度的参数来解决这个问题。

    【讨论】:

      猜你喜欢
      • 2018-01-25
      • 2018-11-21
      • 2015-06-17
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 1970-01-01
      相关资源
      最近更新 更多