这篇文章接着上面一篇文章内容讲的:
上一篇文章地址:文章
- 你可以从这篇文章中获取如下知识
- 了解顺序存储二叉树的概念
- 用java代码实现二叉树的顺序存储
二叉树的系列文章:
- 什么是二叉树(增删改查):https://blog.csdn.net/weixin_46635575/article/details/121121492
- 二叉树的顺序存储:https://blog.csdn.net/weixin_46635575/article/details/121188680
- 线索化二叉树:https://blog.csdn.net/weixin_46635575/article/details/121189266
- 树之赫夫曼树:https://blog.csdn.net/weixin_46635575/article/details/121269506
- 赫夫曼编码:https://blog.csdn.net/weixin_46635575/article/details/121295353
- 二叉排序树:https://blog.csdn.net/weixin_46635575/article/details/121443963
- 多叉树和B树:https://blog.csdn.net/weixin_46635575/article/details/121477970
一、顺序存储二叉树的概念
1、基本说明
从数据的存储来看,数组存储方式和树存储方式可以相互转换,即数组可以转换成树,树可以转换为数组。
- 即在所有的数组中,也可以前序遍历和后续遍历,中序遍历的形式遍历。
2、顺序存储的特点
- 顺序二叉树通常只考虑完全二叉树
- 第n个元素的左子节点为2 * n +1
- 第n个元素的由子节点为2 * n +1
- 第n个元素的父节点为2 * n +1
- 这里的n是二叉树的第几个元素(按零开始表示的)
二、代码实现
1、问题引入
2、代码实现
(1)前序存储
public class ArrayBinaryTree {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7};
//测试一波
ArrBinaryTree arrBinaryTree = new ArrBinaryTree(arr);
arrBinaryTree.preOrder(0);
}
}
//编写一个类ArrayBinaryTree类来实现存储
class ArrBinaryTree {
private int[] arr;//存储数据节点的数组
public ArrBinaryTree(int[] arr) {
this.arr = arr;
}
//编写完成存储二叉树的前序遍历方法
/**
*
* @param index 表示数组的下标
*/
public void preOrder(int index) {
//如果数组为空,就直接返回
if (arr.length == 0 || arr == null) {
System.out.println("数组为空,遍历");
return;
}
//1、前序遍历的的第一步。否则直接打印当前数组的元素
System.out.print(arr[index]);
//2、向左递归遍历
//如果下面这样直接写,如果这个index越界怎么办,所有要加条件
//preOrder(2 * index + 1);
if ((index * 2 + 1) < arr.length) {
preOrder(index * 2 + 1);
}
//3、否则向右递归
if ((index * 2 + 2) < arr.length) {
preOrder(index * 2 + 2);
}
}
}
3、你看上面当中我们测试的时候还要去调用前序遍历的方法,然后还要传入一个0,是不是有点怪怪的,所有我们来改变一下思路,重载的实现
public class ArrayBinaryTree {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7};
//测试一波
ArrBinaryTree arrBinaryTree = new ArrBinaryTree(arr);
arrBinaryTree.preOrder();
}
}
//编写一个类ArrayBinaryTree类来实现存储
class ArrBinaryTree {
private int[] arr;//存储数据节点的数组
public ArrBinaryTree(int[] arr) {
this.arr = arr;
}
//编写完成存储二叉树的前序遍历方法
/**
*
* @param index 表示数组的下标
*/
public void preOrder(int index) {
//如果数组为空,就直接返回
if (arr.length == 0 || arr == null) {
System.out.println("数组为空,遍历");
return;
}
//1、前序遍历的的第一步。否则直接打印当前数组的元素
System.out.print(arr[index]);
//2、向左递归遍历
//如果下面这样直接写,如果这个index越界怎么办,所有要加条件
//preOrder(2 * index + 1);
if ((index * 2 + 1) < arr.length) {
preOrder(index * 2 + 1);
}
//3、否则向右递归
if ((index * 2 + 2) < arr.length) {
preOrder(index * 2 + 2);
}
}
//重载方法
public void preOrder() {
this.preOrder(0);
}
}
效果
(2)中序存储
public void infixOrder(int index) {
//如果数组为空,就直接返回
if (arr.length == 0 || arr == null) {
System.out.println("数组为空,遍历");
return;
}
if ((index * 2 + 1) < arr.length) {
preOrder(index * 2 + 1);
}
System.out.print(arr[index]);
if ((index * 2 + 2) < arr.length) {
preOrder(index * 2 + 2);
}
}
(3)后续存储
不摆了,太简单了,自己去思考一下。