import dataStructure.tree.BinaryNode;            //二叉树的二叉链表结点类
import dataStructure.tree.BinaryTree;            //二叉树类
public class Traverse3                            //构造并遍历二叉树
{    public static BinaryTree<String> create()    //构造指定二叉树
    {
        BinaryNode<String> child_e, child_d, child_b, child_c, child_a;
        child_e = new BinaryNode<String>("E", null, new BinaryNode("F"));
        child_d = new BinaryNode<String>("D",new BinaryNode("G") , null);
        child_c = new BinaryNode<String>("C", null, child_d);
        child_b = new BinaryNode<String>("B", child_e, child_c);
        child_a = new BinaryNode("A", child_b, null);
        return new BinaryTree<String>(child_a);
    }   public static void main(String args[])
    {
        BinaryTree<String> bitree = create();     //创建了如上规则的一棵树
        bitree.preOrder();
        bitree.inOrder();
        bitree.postOrder();
        bitree.getRoot();
        BinaryNode<String> a = bitree.getRoot();
        System.out.println();
        System.out.print("aaaaa"+a.left.data);
        TurnTree turntree = new TurnTree();
        turntree.TurnTree1(a);
    }class NNode<E>                       //二叉树的二叉链表结点类
{
    public E data;                               //数据元素
    public NNode<E> child, brother;            //分别指向左、右孩子结点    public NNode(E data, NNode<E> child, NNode<E> brother)
    {                                            //构造结点,指定元素和左、右孩子结点
        this.data = data;
        this.child = child;
        this.brother = brother;
    }    public NNode(E data)                    //构造有值的叶子结点
    {
        this(data, null, null);
    }    public NNode()
    {
        this(null, null, null);
    }    public boolean isLeaf()                      //判断是否叶子结点
    {
        return this.child==null && this.brother==null;
    }    public String toString()
    {
        return this.data.toString();
    }
}}class BinaryTree1<E>                       //二叉树类
{
    protected NNode<E> root;                //根结点    public BinaryTree1()                          //构造空二叉树
    {
        root=null;
    }    public BinaryTree1(NNode<E> root)        //构造指定根结点的二叉树
    {
        this.root=root;
    }    public boolean isEmpty()                     //判断是否空二叉树
    {
        return this.root==null;
    }    public NNode<E> getRoot()               //返回二叉树的根结点
    {
        return this.root;
    }    public void preOrder()                       //先根次序遍历二叉树
    {
        System.out.print("\n先根序列:  ");
        preOrder(root);
    }    private void preOrder(NNode<E> p)       //先根次序遍历以p结点为根的子二叉树
    {
        if (p!=null)                             //若二叉树不空
        {
            System.out.print(p.data+" ");        //访问当前结点
            preOrder(p.child);                    //按先根次序遍历当前结点的左子树
            preOrder(p.brother);                   //按先根次序遍历当前结点的右子树
        }
    }    public void inOrder()                        //中根次序遍历二叉树
    {
        System.out.print("\n中根序列:  ");
        inOrder(root);
    }    private void inOrder(NNode<E> p)        //中根次序遍历以p结点为根的子二叉树
    {
        if (p!=null)
        {
            inOrder(p.child);                     //中根次序遍历左子树
            System.out.print(p.data+" ");
            inOrder(p.brother);                    //中根次序遍历右子树
        }
    }    public void postOrder()                      //后根次序遍历二叉树
    {
        System.out.print("\n后根序列:  ");
        postOrder(root);
    }    private void postOrder(NNode<E> p)      //后根次序遍历以p结点为根的子二叉树
    {
        if (p!=null)
        {
            postOrder(p.child);
            postOrder(p.brother);
            System.out.print(p.data+" ");
        }
    }    public void insert(NNode<E> p, NNode<E> element, boolean childChild) //插入节点element作为p结点的孩子
    {                                            //若leftChild为true,插入结点作为孩子节点,否则作为兄弟节点
        if (p!=null)
        {
            NNode<E> q = new NNode<E>(element.data);
            if (childChild)
            {
                q.child = p.child;                 //p结点的原左孩子成为q结点的左孩子
                p.child = q;                      //q结点作为p结点的左孩子
            }
            else
            {
                q.brother = p.brother;               //p结点的原右孩子成为q结点的右孩子
                p.brother = q;                     //q结点作为p结点的右孩子
            }
        }
    }
    public void insert(NNode<E> p, NNode<E> element)   //插入元素element作为p结点的左孩子
    {
        insert(p, element, true);
    }}class TurnTree
{
    Traverse2 traverse2 = new Traverse2();
    BinaryTree<String> bitree = traverse2.create();
    NNode<String> p = new NNode<String>("A");   //新的转化得来的树,根节点为p
    BinaryTree1<String> bitree2 = new BinaryTree1<String>(p);     public void TurnTree1()
    {
         System.out.print("\n 请输入二叉树根节点  ");
     }    public void TurnTree1(BinaryNode<String> m)    //二叉树转换成树的过程,m是二叉树的根节点
    {
       BinaryNode<String> m1=new BinaryNode<String>(m.left.data);
       /*这种异常发生在你使用了一个对象,但是这个对象是null,或者没有被创建。
        这个异常是很常见的 而且问题也一目了然,是用了一个空指针
        String   str=null;str.equals( "str ");/////////这是典型例子
        解决也很简单,根据报错的地方看哪个对象是空指针
        一般造成的原因主要是,给一个类对象初始化为null,而之后又没有给它赋值*/
       System.out.println();
        System.out.print("aaaaabbbbbb===="+m1.data);
       
       if(m1!=null)
       {
          NNode<String> b = new NNode<String>(m1.data);
          bitree2.insert(p,b,true);
          p=b;
          TurnTree1(m1);              //递归       }
       BinaryNode<String> m2=new BinaryNode<String>(m.right.data);
       if(m2!=null)
       {
           NNode<String> c = new NNode<String>(m2.data);
           bitree2.insert(p,c,false);
           p=c;
           TurnTree1(m2);
       }
       bitree2.preOrder();
   }
}Exception in thread "main" java.lang.NullPointerException
        at TurnTree.TurnTree1(Traverse3.java:191)
        at TurnTree.TurnTree1(Traverse3.java:205)
        at Traverse3.main(Traverse3.java:39)
我用的netbeans,她说 BinaryNode<String> m1=new BinaryNode<String>(m.left.data);
                        TurnTree1(m1);  
                     turntree.TurnTree1(a);
这三行出现了Exception in thread "main" java.lang.NullPointerException的错误。请问如何解决?谢谢。!
我百度过了, 一般造成的原因主要是,给一个类对象初始化为null,而之后又没有给它赋值。可是我测试过m1的值,用System.out试过了是有值的。真不知道啥回事了。。T T新手做了一个通宵