实例化二叉树中的根的问题

时间:2011-09-06 05:48:29

标签: java

我有问题。我做了以下程序,因为我想创建一个二叉树节点,让实例化器创建一堆树节点,然后让计数器计算节点和叶子。我的问题是这样的:当我调用BTNode(null,null,null)时,我一直得到一个空指针异常。进一步:我必须为这些值设置null,节点按定义指向其他节点,当你实例化root时,右边和左边没有其他节点指向,所以它必须为null。由于某种原因,这完全与java有关,它会抛出一个空指针异常。原因:我没有任何线索,在声明新的BTNode并将其分配为左右之前,我甚至都没有引用这些值。此外,它甚至没有通过构造函数!

请帮忙!

    public class binarytree {
static int nodeCounter=0;
static int leafCounter=0;
public static class BTNode{
    char c;
    BTNode left;
    BTNode right;


public BTNode(Character d, BTNode left1, BTNode right1){
c=d;left=left1;right=right1;}

}
public static void Instantiator(BTNode root){
    int counter=10;
    Instantiator1(root,counter);    
}

public static void Instantiator1(BTNode root,int counter){
    if (counter<=0){
        return;}
    BTNode a=new BTNode(null,null,null);
    BTNode b=new BTNode(null,null,null);
    root.left=a;
    root.right=b;
    counter--;
    Instantiator1(a,counter);
    Instantiator1(b,counter);
    }

public static int Testleaf(BTNode n){
    if(n.left==null && n.right==null)
        return 1;
    else return 0;
}

public static int Testnode(BTNode n){
    if(!(n.left==null && n.right==null))
        return 1;
    else return 0;
}
public static void printNodesandLeaves(BTNode root){
    counter(root);
    System.out.println("Nodes are"+nodeCounter);
    System.out.println("leaves are"+leafCounter);
}
    public static void counter(BTNode r){
        nodeCounter+=Testnode(r);
        leafCounter+=Testleaf(r);
        if (!(r.left==null))
            counter(r.left);
        if (!(r.right==null))
            counter(r.right);}



    public static void main(String[] args){
BTNode root=new BTNode(null,null,null);
Instantiator(root);
printNodesandLeaves(root);

    }}

1 个答案:

答案 0 :(得分:3)

自动取消装箱NullPointerException(Character) null时,您获得char

你的构造函数

public BTNode(Character d, BTNode left1, BTNode right1){
  c=d;left=left1;right=right1;
}

获取Character并将其分配给

char c;

这在技术上是合法的,因为自动装箱但dnull时相当于

c = ((Character) null).charValue()

会产生NullPointerException

你不应该不必要地使用Character,所以我会重写对构造函数的调用

BTNode((char) 0, null, null)

并更改BTNode的签名以取char而不是Character,但您也可以将c=d;更改为

c = d != null ? d.charValue() : (char) 0;