2013-05-27 2 views
0

우리는 7 개의 노드가있는 바이너리 트리를 수동으로 빌드하고 각 노드의 데이터를 선주문 순회에 표시해야하는 데이터 구조 클래스에 할당했습니다. 루트 노드에는 2 개의 하위 노드가 있으며 2 개의 하위 노드에는 각각 2 개의 하위 노드가 있습니다. 나는 첫 번째 트리의 끝까지 전체 왼쪽면을 만들지 만, 일단 첫 번째 오른쪽 자식을 만들면 Null Pointer Exception으로이 지점에 머물러 있습니다. 이와 비슷한 다른 프로젝트를 수색했는데이 코드의 문제점이 무엇인지 알아낼 수 없습니다. 우리가 할당 한 것보다 훨씬 좋은 트리를 생성하는 코드를 발견했지만 클래스에서 수동으로 왼쪽 및 오른쪽 자식을 만드는 것이 제한적입니다. 아마도 간단한 프로그램을 작성하는 데 도움이되는 외부 관점은 크게 감사하겠습니다!자바 : 매뉴얼 바이너리 트리

public class Main { 

public static void main(String[] args) { 

    Node a = new Node(1); 
    Node b = new Node(2); 
    Node c = new Node(3); 
    Node d = new Node(4); 
    Node e = new Node(5); 
    Node f = new Node(6); 
    Node g = new Node(7); 
    BinaryTree t = new BinaryTree(a); 

    t.addleft(a); 
    t.addleft(b); 
    t.addleft(c); 
    t.addParent(); 
    t.addRight(d); 
    t.addParent(); 
    //t.addParent(); 
    //t.addRight(e); 
    //t.addleft(f); 
    //t.addParent(); 
    //t.addRight(g); 


    //System.out.println(n.getData());   

    t.preOrder(t.root); 
} 

}

public class BinaryTree { 
Node root; 
Node current; 

public BinaryTree(Node n){ 
    root = n; 
    n.setParent(current); 
    current = n; 
} 

public void addleft(Node n){  
    current.setLeft(n); 
    current = n;   
} 

public void addRight(Node n){ 
    current.setRight(n); 
    current = n;   
} 

public void addParent(){ 
    current = current.getParent(); 
} 

public void preOrder(Node n){ 
    if(n != null){ 
     System.out.println(n.getData()); 
     preOrder(n.leftChild); 
     preOrder(n.rightChild); 
     return; 
    } 
    return; 

} 

}

public class Node { 
Node parent; 
Node rightChild; 
Node leftChild; 
int data; 

public Node(int i) { 
    data = i; 
    parent = null; 
    rightChild = null; 
    leftChild = null; 
} 

public int getData() { 
    return data; 
} 

public Node getParent() { 
    return parent; 
} 

public void setParent(Node aParent) { 
    parent = aParent; 
} 

public Node getLeft() { 
    return leftChild; 
} 

public void setLeft(Node left) { 
    leftChild = left; 
} 

public void setRight(Node right) { 
    rightChild = right; 
} 

public Node getRight() { 
    return rightChild; 
} 
} 

답변

1

그것의 당신이 노드와 이진 트리를 만들 때 루트로, C는 부모가 없기 때문에.

t.addParent(); 
t.addRight(d); 

를 호출 할 때 첫 번째 줄은 null로 현재 설정, 다음 두 번째 라인은 null 값을 사용하려고 시도합니다.

+0

나는 지난 1 시간 동안 이것을 쳐다 보았고 부모 변수가 가치를 잃는 위치에 대해 여전히 혼란 스럽습니다. 그것은 "current = n;"때문입니다. BinaryTree 클래스의 addLeft 및 addRight 메소드의 행? – user2423368

+0

단계별로 적용. 노드를 만들면 부모가 없습니다 (parent = null;). 모든 노드가 이렇게 생성됩니다. 노드 a (값 1, 부모 = null)를 사용하여 BinaryTree를 만듭니다. 그런 다음 addLeft를 3 번 ​​호출합니다. 매번 현재 값은 전달한 노드로 설정됩니다. t.addleft (c) 다음에 현재 값은 부모가없는 노드입니다. t.addParent();을 호출하면 current가 현재 parent의 값으로 설정되고 null이됩니다 (노드에는 부모가 없습니다). 그러면 t.addRight (d)를 호출 할 때 current.setRight (n)은 널 포인터 예외 인 null.setRight (n)입니다. – Ren

+0

와우, 방금 추가 한 "n.setParent (현재);" 각각의 addLeft 및 addRight 메소드에 적용하면 효과가있는 것처럼 보입니다. 진지하게, 나는 이것 모두를 통하여 나를 걷기 위해 당신을 충분히 감사 할 수 없다! 그렇다면 각각의 추가 메소드에 설정된 상위 코드를 넣으시겠습니까? (이 방법으로 프로젝트를 빌드해야한다고 가정했을 때)? – user2423368