簡體   English   中英

為什么“ res”在我的DFS功能中沒有改變?

[英]Why “res” does not change in my DFS function?

我有以下代碼用於計算樹的深度:

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?)中,函數的參數是通過value傳遞的 這意味着當你寫

DFS(root, res, 1)

您實際上並沒有使用變量res並將其交給DFS函數進行修改。 而是說“復制碰巧存儲在名為res的變量中的任何值,然后將該副本交給DFS

DFS方法具有一個名為res的參數,但是在maxDepth其稱為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返回什么值,以及需要進行哪些更新才能使信息正確傳播。

如果要計算節點的高度,只需在左側和右側樹的最大高度中加一個即可。 如果節點不存在,則它沒有高度。

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

您的解決方案不起作用的原因是res的值是通過諸如templatetypedef之類的值傳遞的。

實際上,您不需要深度參數即可解決此問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM