java中的递归——成员变量,局部变量,静态变量

在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为什么在调用过程中是变化的。

猜你喜欢

转载自blog.csdn.net/u012334071/article/details/41377343