基本说明:
从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转成树,树也可以转成数组。
如图:
上图二叉树的节点,我们可以使用数组的方式来进行存放arr:{1,2,3,4,5,6,7}
我们在遍历这个数组时,仍可以使用二叉树的前序、中序、后序方式进行遍历。
顺序二叉树的特点:
-
顺序二叉树通常只考虑满二叉树
-
第n个节点的左子节点为:2*n+1
-
第n个节点的右子节点为:2*n+2或 2(n+1)
-
第n个节点的父节点为:(n-1)/2
-
n代表二叉树的第几个节点(从0开始)
代码:
package com.lzh.tree;
/**
* 顺序存储二叉树
*/
public class ArrBinaryTreeDemo {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7};
ArrBinaryTree arrBinaryTree = new ArrBinaryTree(arr);
//从根节点开始遍历
//前序方式遍历
//arrBinaryTree.preErgodic(0);
//中序方式遍历
//arrBinaryTree.infixErgodic(0);
//后序方式遍历
arrBinaryTree.postErgodic(0);
}
}
//顺序存储二叉树:以数组的方式存储二叉树的节点,然后以前、中、后序的方式进行遍历
class ArrBinaryTree{
//定义一个属性,用来接收传过来的数组
private int[] arr;
//构造器
public ArrBinaryTree(int[] arr) {
this.arr = arr;
}
//前序的方式遍历
/**
*
* @param index 代表了二叉树中根节点的编号(从0开始)
*/
public void preErgodic(int index){
//判断传过来的是否是空数组,或者数组长度是否为0
if (arr == null || arr.length == 0){
System.out.println("数组为空,无法进行二叉树的前序遍历");
return;
}
//以前序的方式进行遍历,先输出父节点(即先输出当前元素)
System.out.print(arr[index]+" ");
//然后向当前节点的左子节点进行递归遍历
//index * 2 + 1代表第几个左子节点,最多能和arr.length - 1相等 但不能大于arr.length
//index * 2 + 1计算出来的值是二叉树中当前节点的左子节点
if (index * 2 + 1 < arr.length){
//向左递归遍历
preErgodic(index * 2 + 1);
}
//向右递归遍历
//index * 2 + 2计算出来的值是二叉树中当前节点的右子节点
if ( (index+1) * 2 < arr.length){
preErgodic((index+1) * 2);
}
}
//中序的方式遍历
public void infixErgodic(int index){
//判断传过来的是否是空数组,或者数组长度是否为0
if (arr == null || arr.length == 0){
System.out.println("数组为空,无法进行二叉树的中序遍历");
return;
}
//先从当前节点的左子节点开始递归遍历
//index * 2 + 1代表第几个左子节点,最多能和arr.length - 1相等 但不能大于arr.length
if (index * 2 +1 < arr.length){
infixErgodic(index * 2 +1);
}
//输出当前节点
System.out.print(arr[index]+" ");
//然后从当前节点的右子节点开始递归遍历
if (index * 2 + 2 < arr.length){
infixErgodic(index * 2 + 2);
}
}
//后序的方式遍历
public void postErgodic(int index){
//判断传过来的是否是空数组,或者数组长度是否为0
if (arr == null || arr.length == 0){
System.out.println("数组为空,无法进行二叉树的中序遍历");
return;
}
//先从当前节点的左子节点进行递归
if(index * 2 +1 < arr.length ){
postErgodic(index * 2 + 1);
}
//然后从当前节点的右子节点进行递归
if(index * 2 + 2 < arr.length){
postErgodic(index * 2 + 2);
}
//输出当前节点
System.out.print(arr[index]+ " ");
}
}