为什么“ res”在我的DFS功能中没有改变?

时间:2018-07-29 18:49:51

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

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

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最终等于零。看来它从未改变。

有人知道为什么吗?

2 个答案:

答案 0 :(得分:3)

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

DFS(root, res, 1)

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

DFS方法具有一个名为res的参数,但事实并非如此,即它名为res并且您在res中拥有自己的变量名为maxDepth表示这些值是关联的。举例来说,我曾经教过我的班级,里面有六个学生,全都叫佐​​伊(真实的故事!)。尽管他们全都叫佐伊,但他们绝对不是同一个人!我无法与一个叫佐伊的人交谈,并且期望所有其他佐斯都对我们所说的有所了解。同样,您在res中的maxDepth变量与res中的DFS变量是完全独立的。他们碰巧有相同的名字,但他们不是同一个人。

您可以通过多种方法来解决此问题,也许最好的方法是让DFS向您返回一个值,然后像这样编写您的代码:

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

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

从函数返回值是从一种方法获取信息并转移到另一种方法的首选方法。因此,现在您需要做的就是考虑要从DFS返回什么值,以及需要进行哪些更新才能使这些信息正确传播。

答案 1 :(得分:0)

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

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

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

实际上,您不需要具有深度的参数即可解决此问题。