在数组中:
(1)第n个元素的左子节点为 2n + 1;
(2)第n个元素的右子节点为 2n + 2;
(3)第n个元素的父节点为(n-1)/ 2;
n表示二叉树中的第几个元素(按0开始编号),也是在数组中的存储顺序。
需求:给一个数组[1,2,3,4,5,6,7],要求以二叉树的前、中、后序遍历的方式进行输出。
package tree;
/**
* 以数组的方式存储二叉树并完成遍历
*/
public class ArrayBinaryTreeDemo {
public static void main(String[] args) {
int[] arr= {1,2,3,4,5,6,7,};
ArrBinaryTree arrBinaryTree = new ArrBinaryTree(arr);
arrBinaryTree.preOrder();
System.out.println();
arrBinaryTree.infixOrder();
System.out.println();
arrBinaryTree.postOrder();
}
}
class ArrBinaryTree{
private int [] arr;
public ArrBinaryTree(int[] arr){
this.arr = arr;
}
public void preOrder(){//重载preOrder方法,改善观感
this.preOrder(0);
}
public void infixOrder(){
this.infixOrder(0);
}
public void postOrder(){
this.postOrder(0);
}
/**
*前序遍历
* @param index 表示数组的下标
*/
public void preOrder(int index){
if (arr == null || arr.length == 0){
System.out.println("the arr is empty! can't list!");
return;
}
System.out.print(arr[index]);
if ((index * 2 + 1) < arr.length){//向左递归遍历
preOrder(2*index +1);
}
if ((index * 2 + 2) < arr.length) {//向右递归遍历
preOrder(2 * index + 2);
}
}
//中序遍历
public void infixOrder(int index){
if (arr == null || arr.length == 0){
System.out.println("the arr is empty! can't list!");
return;
}
if ((index * 2 + 1) < arr.length){//向左递归遍历
infixOrder(2*index +1);
}
System.out.print(arr[index]);
if ((index * 2 + 2) < arr.length) {//向右递归遍历
infixOrder(2 * index + 2);
}
}
//后序遍历
public void postOrder(int index){
if (arr == null || arr.length == 0){
System.out.println("the arr is empty! can't list!");
return;
}
if ((index * 2 + 1) < arr.length){//向左递归遍历
postOrder(2*index +1);
}
if ((index * 2 + 2) < arr.length) {//向右递归遍历
postOrder(2 * index + 2);
}
System.out.print(arr[index]);
}
}