java实现二叉树

以前学习c对二叉树有必定的了解,如今学习java,想利用java来实现二叉树。java

首先咱们必须知道的几点关于彻底二叉树:算法

除了最后一层之外,每一层上的节点数均达到最大值,在最后一层上只缺乏右边的部分节点数组

知道了这个概念还不行,咱们必须知道若是将一个数组转变成二叉树,对于每个节点的左右子节点的坐标分别是什么数据结构

对于一个彻底二叉树,一、若是一个节点不是叶子节点,那么他的左子节点的坐标必定为2*i+1,若是他的左子节点的坐标小于数组的最大索引length-1,那么它必定有右子节点,坐标必定是2*i+2    二、对于一个彻底二叉树,它的最大的非叶子节点在数组中的坐标必定是length/2-1post

若是理解了上面的结论,建立一个彻底二叉树就很是简单了。学习

下面是实现的具体代码:this

public class BinTree {
	private BinTree leftChild;
	private BinTree rightChild;
	private int data;
	
	public BinTree(int data){
		leftChild=null;
		rightChild=null;
		this.data=data;
	}
	
	//建立二叉树,返回根节点
	public static BinTree createTree(int[] array){
		if(array==null) return null;
		if(array.length<=0) return null;
		//建立根节点,左右子树为空
		BinTree root=new BinTree(array[0]);
		//存放每一个节点信息,便于取值
		List<BinTree> list=new ArrayList<BinTree>();
		list.add(root);
		for(int i=0;i<=array.length/2-1;i++){
			BinTree left=new BinTree(array[2*i+1]);
			list.add(left);
			//当前节点左节点在数组中的坐标为2*i+1,右节点坐标为2*i+2
			list.get(i).leftChild=left;
			if(2*i+1<array.length-1){
				BinTree right=new BinTree(array[2*i+2]);
				list.add(right);
				list.get(i).rightChild=right;
			}
		}
		return root;
	}
}
上面建立了一个彻底二叉树,若是知道上面提到的二叉树的特色的话,仔细阅读代码应该和好理解,其中list的做用主要是为了帮助咱们记录下每个叶子节点的信息,这样咱们在向后遍历时就方便的多。

那么如何遍历二叉树呢,在学习数据结构应该都知道,遍历二叉树分为先序后序中序三种遍历方式,遍历的方法都基本相似,惟一的区别就是输出数据语句的位置不一样,下面是代码:spa

//先序遍历
	public static void preOrderBinTree(BinTree root){
		if(root==null) return;
		System.out.println(root.data);
		preOrderBinTree(root.leftChild);
		preOrderBinTree(root.rightChild);
	}
	//后序遍历
	public static void postOrderBinTree(BinTree root){
		if(root==null) return;
		postOrderBinTree(root.leftChild);
		postOrderBinTree(root.rightChild);
		System.out.println(root.data);
	}
	//中序遍历
	public static void inOrderBinTree(BinTree root){
		if(root==null) return;
		preOrderBinTree(root.leftChild);
		System.out.println(root.data);
		preOrderBinTree(root.rightChild);
	}
其实这就是用的递归算法,仔细理解应该不难,最后运行输出就能够了