之前学习c对二叉树有一定的了解,现在学习java,想利用java来实现二叉树。
首先我们必须知道的几点关于完全二叉树:
除了最后一层以外,每一层上的节点数均达到最大值,在最后一层上只缺少右边的部分节点
知道了这个概念还不行,我们必须知道如果将一个数组转变成二叉树,对于每一个节点的左右子节点的坐标分别是什么
对于一个完全二叉树,1、如果一个节点不是叶子节点,那么他的左子节点的坐标一定为2*i+1,如果他的左子节点的坐标小于数组的最大索引length-1,那么它一定有右子节点,坐标一定是2*i+2 2、对于一个完全二叉树,它的最大的非叶子节点在数组中的坐标一定是length/2-1
如果理解了上面的结论,创建一个完全二叉树就非常简单了。
下面是实现的具体代码:
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 list=new ArrayList();
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
BinTree right=new BinTree(array[2*i+2]);
list.add(right);
list.get(i).rightChild=right;
}
}
return root;
}
}上面创建了一个完全二叉树,如果知道上面提到的二叉树的特点的话,仔细阅读代码应该和好理解,其中list的作用主要是为了帮助我们记录下每一个叶子节点的信息,这样我们在向后遍历时就方便的多。
那么如何遍历二叉树呢,在学习数据结构应该都知道,遍历二叉树分为先序后序中序三种遍历方式,遍历的方法都基本类似,唯一的区别就是输出数据语句的位置不同,下面是代码:
//先序遍历
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);
}其实这就是用的递归算法,仔细理解应该不难,最后运行输出就可以了