为什么我的 DFS 函数中的“res”没有更改?

Why "res" does not change in my DFS function?

提问人:Morty 提问时间:7/30/2018 最后编辑:templatetypedefMorty 更新时间:7/30/2018 访问量:204

问:

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

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,因为它代表二叉树的深度。但最终等于零。似乎它从未改变过。[3, 9, 20, null, null, 15, 7]resres

有谁知道为什么?

Java 递归 binary-tree depth-first-search pass-by-value

评论


答:

3赞 templatetypedef 7/30/2018 #1

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

DFS(root, res, 1)

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

方法 DFS 有一个名为 的参数,但调用它并且你有自己的变量被调用的事实并不意味着这些值是链接的。举个例子,我曾经教过我的班级,有六个学生,他们都叫佐伊(真实故事!虽然他们都叫佐伊,但他们绝对不是同一个人!我不能和一个名叫佐伊的人交谈,并期望所有其他佐伊都对我们谈论的内容有任何暗示。同样,变量 in 与变量 in 是完全分开的。他们巧合地有相同的名字,但他们不是同一个人。resresresmaxDepthresmaxDepthresDFS

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

public int maxDepth(TreeNode root) {
    return DFS(root, 1);
}

private int DFS(TreeNode root, int currDepth) {
    // For you to figure out!
}

从函数返回值是将信息从一个方法获取到另一个方法的首选方法。因此,现在你需要做的是考虑你希望从 DFS 返回什么值,以及你需要对它进行哪些更新才能使该信息正确传播。

评论

0赞 Morty 8/1/2018
哇,非常感谢!你的解释太棒了。
0赞 gil.fernandes 7/30/2018 #2

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

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

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

实际上,您不需要具有深度的参数来解决这个问题。