顺序存储二叉树的概念
基本说明:从数据存储来看。数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组,如右图
要求:
1)右图的二叉树的结点,要求以数组的方式来存放arr:[1,2,3,4,5,6]
2)要求在遍历数组arr时,仍然可以以前序遍历,中序遍历和后序遍历的方式完成
顺序存储二叉树的特点:
- 顺序二叉树的左子节点为2n+1
2)顺序二叉树的左子节点为2n+1 - 第n个元素的右子结点为2*n+2
- 第n个结点的父节点为(n-1)/2
- n:表示二叉树中的第几个元素(按0开始编号如图所示)
顺序存储二叉树遍历
需求:给你一个数组{1,2,3,4,5,6,7},要求以二叉树前序遍历的方式进行遍历,前序遍历的结果应为1,2,3,4,5,6,7
代码实现
package com.atguigu.tree;
import java.security.PublicKey;
public class ArrBinaryTreeDemo {
public static void main(String[] args) {
int[] arr={1,2,3,4,5,6,7};
ArrBinaryTree arrBinaryTree=new ArrBinaryTree(arr);
arrBinaryTree.postOrder(0);
}
}
//编写一个ArrayBinaryTree,实现顺序二叉树遍历
class ArrBinaryTree{
private int[] arr;//存储数据结点的数组
public ArrBinaryTree(int[] arr) {
this.arr = arr;
}
// 编写一个方法,完成前序二叉树的前序遍历
/**
*
* @param index 数组的下标
*/
public void preOrder(int index){
// 如果数组为空,或者arr.length=0
if(arr==null||arr.length==0){
System.out.println("数组为空,不能按照二叉树的前序遍历");
}
// 输出当前这个元素
System.out.println(arr[index]);
// 向左递归遍历
// if((index*2+1)<arr.length){
// preOrder(2*index+1);
// }
向右递归遍历
// if((index*2+2)<arr.length){
// preOrder(2*index+2);
// }
}
public void indexOrder(int index){
if(arr==null||arr.length==0){
System.out.println("数组为空,不能按照二叉树的前序遍历");
}
if((index*2+1)<arr.length){
indexOrder(2*index+1);
}
System.out.println(arr[index]);
if((index*2+2)<arr.length){
indexOrder(2*index+2);
}
}
public void postOrder(int index){
if(arr==null||arr.length==0){
System.out.println("数组为空,不能按照二叉树的前序遍历");
}
if(index*2+1<arr.length){
postOrder(2*index+1);
}
if(index*2+2<arr.length){
postOrder(2*index+2);
}
System.out.println(arr[index]);
}
}