在java的递归过程中,涉及到三种变量,实例成员变量,局部变量,静态变量。成员变量和局部变量一样,都会随着函数递归调用而进栈,而静态变量就相当于c语言中的全局变量,函数在递归过程中调用的全局变量始终是同一个。
package com.algorithm.tree;
import java.lang.reflect.Array;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.Map;
public class BinaryTree<T> {
private T data;
private BinaryTree left;
private BinaryTree right;
private boolean visted=false;
private static int i=0;
public BinaryTree(){
}
public BinaryTree(T[] array){ /*非递归建立二叉树*/
int length=Array.getLength(array);
ArrayDeque<BinaryTree<T>> arrayDeque=new ArrayDeque<>(length);
if(array[0]!=null){
this.setData(array[0]);
arrayDeque.offer(this);
}else
return;
int i=0;
while(!arrayDeque.isEmpty()){
BinaryTree<T> parent=arrayDeque.poll();
if(i+1<length){
BinaryTree<T> left=null;
if(array[++i]!=null){
left=new BinaryTree<>();
left.setData(array[i]);
parent.setLeft(left);
arrayDeque.offer(left);
}
}else{
break;
}
if(i+1<length){
BinaryTree<T> right=null;
if(array[++i]!=null){
right=new BinaryTree<>();
right.setData(array[i]);
parent.setRight(right);
arrayDeque.offer(right);
}
}else{
break;
}
}
}
输出结果:
第0次遍历的节点为0
第1次遍历的节点为1
第2次遍历的节点为3
第3次遍历的节点为7
第4次遍历的节点为11
第5次遍历的节点为12
第6次遍历的节点为8
第7次遍历的节点为13
第8次遍历的节点为4
第9次遍历的节点为9
第10次遍历的节点为10
第11次遍历的节点为2
从上面的运行结果可以看出,静态变量i实现了累加,故递归过程中始终是同一个,而实例成员data则不断变化,关于这一点,是因为调用函数preOrderRecursive()的对象是这个函数的隐式参数,故这个函数可以看作如下形式:
public void preOrderRecursive(BinaryTree btree){ /*这里作为btree的参数是一定不为空的*/
System.out.println("第"+i+++"次遍历的节点为"+btree.data);
if(btree.left!=null) preOrderRecursive(left);
if(btree.right!=null) preOrderRecursive(right);
}
这就解释了data为什么在调用过程中是变化的。