我正在解決這個 leetcode 問題https://leetcode.com/problems/binary-tree-right-side-view/description/。以下代碼工作正常。class Solution { public List<Integer> rightSideView(TreeNode root) { List <Integer> ans = new LinkedList<>(); if (root == null) return ans; traverse(root, ans, 0); return ans; } public void traverse(TreeNode root, List<Integer> ans, int currDepth){ if (root == null) return; if (ans.size() == currDepth) ans.add(root.val); traverse(root.right, ans, currDepth + 1); traverse(root.left, ans, currDepth + 1); }}但是,在最后 2 次遞歸調用中,如果我將行更改為 traverse(root.right, ans, ++currDepth); traverse(root.left, ans, ++currDepth);代碼失敗,為什么會發生這種情況?兩個版本不應該是等價的嗎?
1 回答

飲歌長嘯
TA貢獻1951條經驗 獲得超3個贊
讓我們說 currDepth = 0
在您的第一個版本中,兩個遞歸調用將如下所示:
traverse(root.right, ans, 1);
traverse(root.left, ans, 1);
這是正確的,因為您希望兩個遞歸調用都進入下一個級別。
在您的第二個版本中,它看起來像這樣:
traverse(root.right, ans, 1);
traverse(root.left, ans, 2);
這意味著第一個遞歸調用工作正常,但第二個是錯誤的(跳過一個級別)。
為什么?你改變了你的currDepth參數。您的代碼的第一個版本不會更改它。它傳遞currDepth + 1到下一個級別。
添加回答
舉報
0/150
提交
取消