2013-05-27 7 views
0

У нас есть назначение в моем классе структур данных, где мы должны вручную построить двоичное дерево с общим количеством 7 узлов и отобразить данные в каждом узле в обход порядка. Корневой узел имеет 2 детей, и каждый из этих 2 детей имеет 2 детей. Я дошел до того, что создал всю левую сторону до конца первого дерева, но застрял в этой точке с помощью Null Pointer Exception после создания первого правого ребенка. Я искал другие проекты, подобные этому, и я до сих пор не могу понять, в чем проблема с этим кодом. Я нашел код, который создает дерево намного лучше, чем мы были назначены, но мы ограничены в классе, чтобы вручную создавать левых и правых детей. Любая внешняя перспектива, чтобы помочь, что, вероятно, простая программа для создания, будет с благодарностью!Java: Ручное двоичное дерево

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

Его, потому что при создании двоичного дерева с узлом А в качестве корня, с не имеет родителя.

Когда вы звоните

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

первая строка задает ток до нуля, то вторая линия пытается использовать нулевое значение.

+0

Я смотрел на это в течение прошедшего часа и до сих пор смущен относительно того, где родительская переменная теряет свою ценность. Это из-за "current = n;" строка в классах BinaryTree, addLeft и addRight? – user2423368

+0

Принимая это шаг за шагом. Когда узел создается, он не имеет родителя (parent = null;). Все узлы создаются таким образом. Вы создаете BinaryTree с узлом a (значение 1, parent = null). Затем вы вызываете addLeft 3 раза. Каждый раз значение тока устанавливается на узел, который вы передали. После t.addleft (c) значение тока представляет собой узел, у которого нет родителя. Когда вы вызываете t.addParent() ;, он вызывает set current для значения родительских токов, которое равно null (у Node еще нет родителя). Затем, когда вы вызываете t.addRight (d), вы вызываете current.setRight (n), который является null.setRight (n), который является исключением вашего нулевого указателя. – Ren

+0

Вау, я просто добавил свой «n.setParent (текущий)»; для каждого метода addLeft и addRight, и, похоже, он сработал. Серьезно, я не могу поблагодарить вас за то, что пропустил меня через все это! Итак, вы бы поставили исходный родительский код с каждым методом добавления (при условии, что вам было поручено построить проект таким образом)? – user2423368

Смежные вопросы