以前学习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); }其实这就是用的递归算法,仔细理解应该不难,最后运行输出就能够了