我正在做一個 leetcode 問題https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree-ii/,我對在遞回呼叫期間如何存盤方法的引數感到困惑。
如果一個節點被訪問,我想保存它被訪問的狀態。當我發送兩個變數時,當堆疊展開時,更新的變數值將丟失。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
boolean val1 = false, val2 = false;
System.out.println("val1 - " val1 " val2 - " val2);
System.out.println();
TreeNode node = lca(root, p, q, val1, val2);
System.out.println();
System.out.println("val1 - " val1 " val2 - " val2);
if(val1==true && val2==true)
return node;
return null;
}
private TreeNode lca(TreeNode root, TreeNode p, TreeNode q, boolean val1, boolean val2) {
if(root==null)
return root;
else if( p==root){
val1 = true;
System.out.println("val1 - " val1 " val2 - " val2);
return root;
}
else if( root==q){
val2 = true;
System.out.println("val1 - " val1 " val2 - " val2);
return root;
}
TreeNode left = lca(root.left, p, q, val1, val2);
TreeNode right = lca(root.right, p, q, val1, val2);
if(left==null && right==null) return null;
else if(left==null) return right;
else if(right==null) return left;
else return root;
}
}
Output -
val1 - false val2 - false
val1 - true val2 - false
val1 - false val2 - true
val1 - false val2 - false
但是,如果我發送一個陣列并更新陣列內的值并在遞回期間將陣列本身作為引數傳遞,那么更新的變數值將被持久化。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
boolean res[] = new boolean[2];
//boolean val1 = false, val2 = false;
System.out.println("val1 - " res[0] " val2 - " res[1]);
System.out.println();
TreeNode node = lca(root, p, q, res);
System.out.println();
System.out.println("val1 - " res[0] " val2 - " res[1]);
if(res[0]==true && res[1]==true)
return node;
return null;
}
private TreeNode lca(TreeNode root, TreeNode p, TreeNode q, boolean res[]) {
if(root==null)
return root;
else if( p==root){
res[0] = true;
System.out.println("val1 - " res[0] " val2 - " res[1]);
return root;
}
else if( root==q){
res[1] = true;
System.out.println("val1 - " res[0] " val2 - " res[1]);
return root;
}
TreeNode left = lca(root.left, p, q, res);
TreeNode right = lca(root.right, p, q, res);
if(left==null && right==null) return null;
else if(left==null) return right;
else if(right==null) return left;
else return root;
}
}
Output -
val1 - false val2 - false
val1 - true val2 - false
val1 - true val2 - true
val1 - true val2 - true
我覺得我在這里缺少一些基本知識,任何人都可以幫助我了解這兩個代碼的不同之處以及我可以閱讀的任何材料以提高我對堆疊和遞回的了解嗎?
uj5u.com熱心網友回復:
這個問題與“遞回”關系不大,而與函式呼叫本身有關。
當您呼叫foo(var1, var2)時,變數按值傳遞。您在功能塊內所做的更改不會傳播到功能之外。
當你傳遞陣列時,它通過參考/指標傳遞。對其進行的任何修改都是對它的實際記憶體進行的,因此即使在功能塊之外,更改也會保留/反映。
您可以在此處閱讀有關按值傳遞和參考之間的區別的更多資訊。
編輯:
Java“總是”按值傳遞,因為物件具有按值傳遞的參考。這個令人困惑的術語在這里詳細說明。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/472652.html
上一篇:Matlab矩陣到單元格
