System.out.println(ancestor.data)LCA()即使我的遞回將值findlca()設定ancestor為值為 4 的節點,inside方法也會拋出 NPE。我可以從使用除錯指標中看到這一點。一旦我走出我的遞回ancestor欄位設定為空。物件參考不應該改變,對吧?
public class LCA {
static class Node {
int data;
Node left;
Node right;
Node(int data){
this.data =data;
}
}
public static Node lca(Node root, int v1, int v2) {
Node ancestor = null;
findlca(root, v1, v2, ancestor);
System.out.println(ancestor.data);
return ancestor;
}
public static boolean findlca(Node node, int v1, int v2, Node ancestor){
if(node==null){
return false;
}
boolean nodeMatch = false;
if(node.data==v1 || node.data==v2){
nodeMatch = true;
}
boolean leftMatch = findlca(node.left, v1, v2, ancestor);
boolean rightMatch = findlca(node.right, v1, v2, ancestor);
if((leftMatch && rightMatch) || (leftMatch && nodeMatch) || (rightMatch && nodeMatch)){
ancestor = node;
}
return leftMatch || nodeMatch || rightMatch;
}
public static void main(String[] args) {
Node root = new Node(4);
root.left = new Node(2);
root.right = new Node(7);
root.left.left = new Node(1);
root.left.right = new Node(3);
root.right.left = new Node(6);
Node ancestor = lca(root, 1, 7);
System.out.println(ancestor.data);
}
}
uj5u.com熱心網友回復:
Java 是按值傳遞,而不是按參考傳遞,因此變數 in 不是您在ancestor開頭findlca()宣告的,而是它的副本。當然,它們可能參考同一個物件,但它們本身是不同的變數。ancestorlca()
要修復它,只需將ancestorin分配lca()給findlca().
ancestor = findlca(root, v1, v2, ancestor)
uj5u.com熱心網友回復:
我認為這樣的文章會回答你的問題。
每當將物件作為引數傳遞時,都會創建參考變數的精確副本,該副本指向堆記憶體中物件的與原始參考變數相同的位置。
因此,每當我們在方法中對同一物件進行任何更改時,該更改都會反映在原始物件中。但是,如果我們為傳遞的參考變數分配一個新物件,那么它將不會反映在原始物件中。
要修復您的代碼,您可以在類 Node 中添加空建構式,使用空建構式創建物件并在 findlca(...) 中填充他的欄位
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/461014.html
