【问题标题】:Java: Manual Binary TreeJava:手动二叉树
【发布时间】:2013-05-27 00:58:51
【问题描述】:

我们在我的数据结构类中有一个任务,我们必须手动构建一个总共有 7 个节点的二叉树,并在前序遍历中显示每个节点中的数据。根节点有 2 个孩子,这 2 个孩子中的每一个都有 2 个孩子。我已经开始创建整个左侧到第一棵树的末尾,但是一旦我创建了第一个右子节点,我就陷入了空指针异常。我已经搜索了与此类似的其他项目,但我似乎仍然无法找出这段代码的问题所在。我发现创建树的代码比我们分配的要好得多,但是我们在课堂上仅限于手动创建左右子节点。非常感谢任何外部观点来帮助创建一个可能很简单的程序!

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;
}
}

【问题讨论】:

    标签: java binary-tree preorder


    【解决方案1】:

    这是因为当您创建以节点 a 为根的二叉树时,c 没有父节点。

    当你打电话时

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

    第一行将 current 设置为 null,然后第二行尝试使用 null 值。

    【讨论】:

    • 过去一个小时我一直盯着这个,但仍然对父变量在哪里失去它的价值感到困惑。是不是因为“current = n;” BinaryTree 类中的行,addLeft 和 addRight 方法?
    • 一步一步来。创建节点时,它没有父节点(parent = null;)。所有节点都是以这种方式创建的。您使用 Node a(值 1,parent = null)创建一个 BinaryTree。然后你调用 addLeft 3 次。每次,current的值都设置为你传入的Node。在t.addleft(c)之后,current的值是一个没有父节点的Node。当您调用 t.addParent(); 时,它会调用将 current 设置为 currents 父级的值,该值为 null(还没有 Node 有父级)。然后,当您调用 t.addRight(d) 时,您调用 current.setRight (n),也就是null.setRight(n),就是你的空指针异常。
    • 哇,我刚刚添加了我的“n.setParent(current);”对于每个 addLeft 和 addRight 方法,它似乎都有效。说真的,我非常感谢你让我经历了这一切!那么您是否会将设置的父代码与每个添加方法一起放入(假设您的任务是以这种方式构建项目)?
    • 是的。添加节点时,您知道该节点的父节点,因此您应该设置它。 IE。每次添加一个节点后,您的树应该具有遍历它所需的完整信息集。顺便说一句 - 如果这个答案解决了你的问题,请点击勾选接受它:)
    • 事后思考后说得通。再次感谢!巨大的帮助
    猜你喜欢
    • 2021-02-26
    • 1970-01-01
    • 2017-12-19
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多