顺序存储二叉树
1.基本概念
从数据存储方式来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组。
2.顺序存在二叉树的特点
- 顺序存储二叉树通常只考虑完全二叉树
- 第n个元素的左子结点为 2*+1(对应于数组的下标值)
- 第n个元素的右子结点为 2 * n + 2(对应于数组的下标值)
- 第n个结点的父结点为 (n-1)/2
- n: 表示二叉树中的第几个元素(按0开始编号),如上图所示
3.代码实现
public class ArrBinaryTreeDemo {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7};
//创建一个ArrBinaryTree
ArrBinaryTree arrBinaryTree = new ArrBinaryTree(arr);
// arrBinaryTree.preOrder(0);//注意这里要传入参数0,使用重载的方法来避免重这里传入参数
//arrBinaryTree.preOrder();
arrBinaryTree.infixOrder();
arrBinaryTree.postOrder();
}
}
//编写ArrBinaryTree类,实现顺序存储二叉树
class ArrBinaryTree{
// 存储数据结点的数组
private int[] arr;
public ArrBinaryTree(int[] arr) {
//super();
this.arr = arr;
}
// 重载preOrder()方法
public void preOrder(){
this.preOrder(0);//这里将参数为0的根结点传入,不用在函数调用的时候传入参数
}
// 重载infixOrder()方法
public void infixOrder() {
this.infixOrder(0);// 这里将参数为0的根结点传入,不用在函数调用的时候传入参数
}
// 重载postOrder()方法
public void postOrder() {
this.postOrder(0);// 这里将参数为0的根结点传入,不用在函数调用的时候传入参数
}
// 编写方法实现顺序存储二叉树的前序遍历
/**
*
* @param index 表示数组的小标,从0开始
*/
public void preOrder(int index){
//如果数组为空,和数组长度为0,不能遍历
if (arr == null && arr.length == 0) {
System.out.println("数组为空,不能进行前序遍历");
}
// 输出当前这个元素
System.out.println(arr[index]);
//向左子树进行递归
// 注意需要判断是否超过数组的长度
if (arr.length > (2*index + 1)) {
preOrder(2*index + 1);
}
//向右子树进行递归
if (arr.length > (2*index + 2)) {
preOrder(2*index + 2);
}
}
// 编写方法实现顺序存储二叉树的中序遍历
public void infixOrder(int index){
//判断数组是否为空
if (arr == null && arr.length == 0) {
System.out.println("数组为空,不能进行遍历");
}
//向左递归子树
if (arr.length > (2*index + 1)) {
infixOrder(2*index +1);
}
//输出当前结点
System.out.println(arr[index]);
//向右递归子树
if (arr.length > (2*index + 2)) {
infixOrder(index*2 + 2);
}
}
// 编写方法实现顺序存储二叉树的后序遍历
public void postOrder(int index){
//判断数组是否为空
if (arr == null && arr.length == 0) {
System.out.println("数组为空,不能进行遍历");
}
//向左递归子树
if (arr.length > (2*index + 1)) {
postOrder(2*index +1);
}
//向右递归子树
if (arr.length > (2 * index + 2)) {
postOrder(index * 2 + 2);
}
// 输出当前结点
System.out.println(arr[index]);
}
}
4.方法重载的使用
重载是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不相同
重载的规则:
- 被重载的方法必须改变参数列表(参数个数或类型不一样)
- 被重载的方法可以改变返回类型
- 被重载的方法可以改变访问修饰符
- 被重载的方法可以声明新的或更广的检查异常
- 方法能够在同一个类中或者在一个子类中被重载
重载的意义:
让方法使用相同的方法名,再各自使用自己的形参,最终在用户使用时,系统就可以根据用户输入的数据的类型进行方
法的匹配,避免了使用者需要记忆大量的方法名。(在上面的代码中体现)