先说一下在学习过程遇到的问题

1.遇到了空指针问题,经过指点才知道是值类型和引用类型的乱用,先说一下自己理解的值类型,所谓值类型就是在栈中直接生成的不在堆中有引用,举个例子 int i =9。数据结构---关于2叉树的添加问题,还有在学习过程遇到的问题而引用类型,则是在内存中开辟一个空间,由堆中所申请的指向他,如Tree tree =new Tree();数据结构---关于2叉树的添加问题,还有在学习过程遇到的问题

并且在这个期间还遇到一个问题就是类的初始化顺序的问题

public class TreeTest {
      public static TreeLink treeLink  = new TreeLink();

    public static void main( String[] args ) {
        int a[] ={20,50,13,42,1,6,48,6,56,74,13,54,31,15,64,21,48,13,16,23,13};

       // TreeLink treeLink  = new TreeLink();
        treeLink.data =a[0];

        for (int i =1;i<a.length;i++){
            add(a[i],treeLink);

            }
        System.out.println(treeLink);



    }

    public static void add(int data, TreeLink node){
        if(data <= node.data){

            if( node.leftNode != null ){

                add(data,node.leftNode);
            }
            TreeLink leftNode = new TreeLink();
            leftNode.data = data;
            node.leftNode = leftNode;
        }else{
            if( node.rightNode != null ){

                add(data,node.leftNode);
            }
            TreeLink rightNode = new TreeLink();
            rightNode.data = data;
            node.rightNode = rightNode;
        }
    }
}

这样会报空指针错误在第21行。因为这个是初始化的错误。对于静态变量,静态初始化块,变量,构造器等,他们的顺序是静态变量,静态初始化块,变量,初始化块,构造器,接下来我会用代码来测试一下

public class Test {
    public static String a ="静态变量";
    public  String b ="变量";
    static {
        System.out.println(a);
        System.out.println("静态初始化块");
    }
    {
        System.out.println(b);
        System.out.println("初始化块");
    }
    public  Test(){
        System.out.println("构造");
    }

    public static void main( String[] args ) {
       new Test();
    }
}

这样得出结论

静态变量

静态初始化块

变量
初始化块

构造

但是我又测试了一下,把顺序掉一下会怎么样

public class Test {
    public static String a ="静态变量";
    public  String b ="变量";
    public  Test(){
        System.out.println("构造");
    }
    {

        System.out.println("初始化块");
        System.out.println(b);
    }
    static {

        System.out.println("静态初始化块");
        System.out.println(a);
    }


    public static void main( String[] args ) {
       new Test();
    }
}

最后结果

静态初始化块
静态变量
初始化块
变量

构造

这样得出(静态初始化块,静态变量)>(初始化块,变量)>(构造)

接下来 讲解一下2叉树的添加方法,先上代码

public class TreeLink {
    private int data;
    private TreeLink Node;
    private TreeLink LNode;
    private TreeLink RNode;
    TreeLink(){

    }
    TreeLink(int data){
        this.data =data;
    }
    TreeLink(int data,TreeLink Node){
        this.data =data;
        this.Node =Node;
    }
    TreeLink(int data,TreeLink LNode,TreeLink RNode){
        this.data =data;
        this.LNode =LNode;
        this.RNode =RNode;
    }

    @Override
    public String toString() {
        return "TreeLink{" +
                "data=" + data +
                ", Node=" + Node +
                ", LNode=" + LNode +
                ", RNode=" + RNode +
                '}';
    }

    public void add( int data, TreeLink Node){
        if (Node == null){

        }else {
            if (data<=Node.data){
               if (Node.LNode !=null){
                   add(data,Node.LNode);
               }else {
                   TreeLink leftNode = new TreeLink(data);
                   Node.LNode = leftNode;
               }
            }
            else {
                if (Node.RNode !=null){
                    add(data,Node.RNode);
                }
                else {
                    TreeLink rightNode =new TreeLink(data);
                    Node.RNode =rightNode;
                }
            }
        }
    }
}
public class TreeMain {
    public static void main( String[] args ) {
        int arr[] ={20,5,6,87,45,12,314,45,12,2,6,9};
     TreeLink treeLink =new TreeLink(arr[0]);
     for (int i =1;i<arr.length;i++){
         treeLink.add(arr[i],treeLink);
     }
     System.out.println(treeLink);
    }
}
添加方法,最大思想就是用到了递归,当然也可以不用,代码给出的是很简单的添加方法,可以理解为先中后序的添加,其实很想,先判断节点是否为空,不为空往下走比较给出节点数据大于往右,小于等于往左走,判断一下节点的左右是不是为空,为空就生成一下节点,将值填入,不为空接着找。

相关文章: