2013-09-25 4 views
1

방금 ​​이진 트리에 대해 배웠고 삽입 방법을 만들려고했습니다. 내 첫 번째 방법은 효과가 없었고 조금 수정했습니다. 이제는 작동하지만 이전 방법이 실패한 이유를 이해할 수 없습니다. 작동하지 않는바이너리 트리 : 하나의 삽입 방법이 작동하지 않는 이유

방법은 다음과 같습니다

if(root == null) 
    { 
     root = new Node(data); 
    } 
    else if(data < root.getData()) 
    { 
     insertNode(root.getLeft(), data); 
    } 
    else 
    { 
     insertNode(root.getRight(), data); 
    } 

일이 않는 방법 :이 경우 이유에

if(data < root.getData()) 
    { 
     if(root.getLeft() == null) 
     { 
      root.left = new Node(data); 
     } 
     else 
     { 
      insertNode(root.getLeft(), data); 
     } 
    } 

    else 
    { 
     if(root.getRight() == null) 
     { 
      root.right = new Node(data); 
     } 
     else 
     { 
      insertNode(root.getRight(), data); 
     } 
    } 

어떤 설명? 내가 보는 방식 때문에 루트는 root.left와 같아야합니다. 따라서 루트를 새로운 노드로 설정하는 것은 root.left/right를 새 노드로 설정하는 것과 동일해야합니다.

+1

두 번째 코드의 예외/문제점은 무엇입니까? 나는 두 번째 코드에서 루트 == null 체크를 보지 못했다. 이 경우 첫 번째 요소를 삽입 할 수 없습니다. – JohnnyAW

+0

@JohnnyAW : 첫 번째 코드에서 insertNode (null, data)를 호출하면 작동하지 않습니다. 하지만 그것을 얻으려면 시간이 필요했습니다 ^^ –

+0

@ user2776326 루트가 null 인 경우 데이터와 비교할 때 두 번째 코드가 문제가되는 것 같습니까? –

답변

2

첫 번째 방법에서는 insertNode 메서드에 null을 제공하지만 참조 포인터는 반환하지 않습니다. 따라서 insertNode 메소드에서 root = new Node()를 설정했으나 상위 노드는이 중 하나를 알지 못하지만 여전히 null을 가리 킵니다.

매우 기본적인 Java 이해이므로 "java 매개 변수 전달"에 대한 기사를 읽는 것이 좋습니다. http://javadude.com/articles/passbyvalue.htm

+1

감사합니다. 제 생각에는 이해합니다. 따라서 내가 모은 것에서 Java는 매개 변수에 null 값을 전달하므로 본질적으로 insertNode (null, data)를 얻고 root.right/left에 대한 참조는 없습니다. 그 맞습니까? – user2776326

+1

좋은 답변, 내가 작전 대원이라면, 나는 그것을 받아 들일 것이다. –

+0

@ user2776326 : 예, 제대로 이해했습니다. –

0

재귀 메소드를 호출한다는 가정 insertNode(root, data), 당신은 rootroot = new Node(data);는 그의 시인성 insertNode 방법에 한정 인 객체를 생성하는 수단을 실행하지 null 있는지 확인해야한다.

그렇지 않은 경우 null 인 경우 insertNode(data)을 비회원으로 다시 작성하고 그 안에 root을 생성 할 수 있습니다.

public void insert(int data) { 
    if(root == null){ 
     root = new Node(data); 
    } 
    else { 
     Node current = root; 
     Node previous; 
     String from; 
     while(current != null) { 
      previous = current; 
      if(data < current.getData()) { 
       current = current.left(); 
       from = "left"; 
      } 
      else { 
       current = current.right(); 
       from = "right"; 
      } 
     } 
     current = new Node(data); 
     if(from.equals("left")) { 
      previous.left() = current; 
     } else { 
      previous.right() = current; 
     } 
    } 
} 
관련 문제