우리는 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 시간 동안 이것을 쳐다 보았고 부모 변수가 가치를 잃는 위치에 대해 여전히 혼란 스럽습니다. 그것은 "current = n;"때문입니다. BinaryTree 클래스의 addLeft 및 addRight 메소드의 행? – user2423368
단계별로 적용. 노드를 만들면 부모가 없습니다 (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
와우, 방금 추가 한 "n.setParent (현재);" 각각의 addLeft 및 addRight 메소드에 적용하면 효과가있는 것처럼 보입니다. 진지하게, 나는 이것 모두를 통하여 나를 걷기 위해 당신을 충분히 감사 할 수 없다! 그렇다면 각각의 추가 메소드에 설정된 상위 코드를 넣으시겠습니까? (이 방법으로 프로젝트를 빌드해야한다고 가정했을 때)? – user2423368