2017-12-06 2 views
-1

바이너리 트리 재귀에서 로컬 인 매개 변수는 무엇입니까? 내가 <code>list = helper(node.left, list);</code> 할 필요가 없습니다 왜이 질문에

import java.util.*; 


    public static void main(String[] args) { 

     TreeNode root = new TreeNode(8); 
     root.left = new TreeNode(7); 
     root.right = new TreeNode(6); 
     root.left.left = new TreeNode(5); 
     root.right.right = new TreeNode(4); 
     List<Integer> list = postorderTraversal(root); 
     System.out.println(list); 
    } 

    public static List<Integer> postorderTraversal(TreeNode root) { 
     List<Integer> list = new ArrayList<Integer>(); 
     list = helper(root, list); 
     return list; 
    } 

    private static List<Integer> helper(TreeNode node, List<Integer> list){ 
     if (node != null) { 
      helper(node.left, list); 
      helper(node.right, list); 
      list.add(node.val); 
     } 
     return list; 
    } 
} 
, 내가 왜 여기에 글로벌 list 이해하지 않고 내 루트를 변경하고있을 때이 지역의 내가 root.left = recurse(root.left)을 할 필요가?

+0

코드를 다시 포맷하는 것이 좋습니다. – ice1000

+0

내가 게시 한 코드의 어느 곳에 나 위에서 언급 한 코드 줄이 보이지 않습니다. –

답변

0

이것은 자바에서 포인터가 작동하는 방식 때문입니다. 함수에 매개 변수로리스트를 전달하면 객체 자체를 전달하지 않고 컴퓨터의 메모리 주소를 전달하게됩니다. 이 메모리 주소는 포인터라고하며 객체를 값 비싸게 복제하지 않으므로 유용합니다.

일반적으로 자바는 일반적으로 포인터를 사용한다는 사실을 숨기므로이 사실을 알지 못합니다. 예를 들어, list.add (...)를 수행하면 java가 포인터 대신 객체를 자동으로 대체하기 때문에 일반 객체를 사용하고 add()를 호출하는 것처럼 작동합니다.

그래서 목록은 포인터를 무언가에 전달할 때마다 포인터가 여전히 동일한 메모리 섹션을 참조하기 때문에 일종의 전역 변수와 비슷합니다. 메모리의 해당 섹션을 변경하면 다른 모든 포인터가 볼 수있는 것에 영향을 미치므로 다른 함수에서 볼 수있는 변경 사항을 얻을 수 있습니다.

0

List<Integer> list = new ArrayList<Integer>(); 

두 가지를 않습니다. 먼저 힙에 새로운 ArrayList 오브젝트를 할당합니다. 그런 다음 로컬 변수 list에 해당 힙 객체에 참조을 저장합니다. helper을 호출 할 때 참조 만 전달하며 이는 힙의 실제 개체를 참조하는 메모리 주소라고 생각할 수 있습니다. 이 참조는 helper의 재귀 호출로 전달됩니다. 각 호출은 list의 로컬 사본을 가지지 만, 이것은 힙 오브젝트가 아닌 참조의 사본입니다. list의 모든 인스턴스는 동일한 힙 오브젝트 (처음에 할당 한 힙 오브젝트)를 참조하십시오. 이것이 그것이 글로벌 인 것처럼 "느끼는"이유입니다. 그러나 그것은 확실히 아닙니다.

동일한 개념은 자바의 모든 객체 참조에 사실, TreeNode 참조에 적용됩니다.

이것은 새로운 Java 프로그래머에게 매우 혼란 스러울 수 있습니다. Java는 메소드를 호출 할 때 매개 변수가 복사된다는 것을 의미하는 "값 별 전달"이지만 변수가 객체 인 경우 "값"은 객체 자체가 아닌 참조이며 참조 만 복사됩니다. 매개 변수 전달을 위해 복사 된 유일한 값은 프리미티브 값 (boolean, char, int, long, float, double)입니다.