先说一下在学习过程遇到的问题
1.遇到了空指针问题,经过指点才知道是值类型和引用类型的乱用,先说一下自己理解的值类型,所谓值类型就是在栈中直接生成的不在堆中有引用,举个例子 int i =9。而引用类型,则是在内存中开辟一个空间,由堆中所申请的指向他,如Tree tree =new Tree();
并且在这个期间还遇到一个问题就是类的初始化顺序的问题
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); } }添加方法,最大思想就是用到了递归,当然也可以不用,代码给出的是很简单的添加方法,可以理解为先中后序的添加,其实很想,先判断节点是否为空,不为空往下走比较给出节点数据大于往右,小于等于往左走,判断一下节点的左右是不是为空,为空就生成一下节点,将值填入,不为空接着找。