一、顺序存储二叉树的概念
从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组, 示意图如下:
要求:
-
右图的二叉树的结点,要求以数组的方式来存放 arr : [1, 2, 3, 4, 5, 6, 6]
-
要求在遍历数组 arr 时,仍然可以以前序遍历,中序遍历和后序遍历的方式完成结点的遍历
顺序存储二叉树的特点:
-
顺序二叉树通常只考虑完全二叉树
-
第 n 个元素的左子节点为 2 * n + 1
-
第 n 个元素的右子节点为 2 * n + 2
-
第 n 个元素的父节点为 (n-1) / 2
-
n : 表示二叉树中的第几个元素(按 0 开始编号如图所示)
二、代码实现
package cn.zzw.algorithm.Tree;
import javax.swing.plaf.PanelUI;
public class ArrBinaryDemo {
public static void main(String[] args) {
int[] arr={
1,2,3,4,5,6,7};
//创建一个ArrayBinary
ArrBinaryTree arrBinaryTree=new ArrBinaryTree(arr);
//测试先序遍历
System.out.println("先序遍历结果为");
arrBinaryTree.preOrder();
System.out.println();
//测试中序遍历
System.out.println("中序遍历结果为");
arrBinaryTree.infixOrder();
System.out.println();
//测试后序遍历
System.out.println("后序遍历结果为");
arrBinaryTree.postOrder();
}
}
//编写一个 ArrBinaryTree,实现顺序存储二叉树的遍历
class ArrBinaryTree
{
//定义一个数组存储数据结点的数组
private int[] arr;
public ArrBinaryTree(int[] arr)
{
this.arr=arr;
}
//为了main方法中好调用,进行preOrder的重载
public void preOrder()
{
this.preOrder(0);
}
public void infixOrder()
{
this.infixOrder(0);
}
public void postOrder()
{
this.postOrder(0);
}
//编写方法,完成顺序存储二叉树的先序遍历
public void preOrder(int index)
{
//如果数组为空,或者数组长度为0就不能遍历
if (arr==null||arr.length==0)
{
System.out.println("数组为空,不能进行二叉树的前序遍历");
}
//输出当前元素
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)
{
//如果数组为空,或者数组长度为0就不能遍历
if (arr==null||arr.length==0)
{
System.out.println("数组为空,不能进行二叉树的中序遍历");
}
//向左递归遍历
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)
{
//如果数组为空,或者数组长度为0就不能遍历
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.print(arr[index]);
}
}
测试结果:
"C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" "-javaagent:D:\IntelliJ IDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=56478:D:\IntelliJ IDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;C:\Users\1\IdeaProjects\algorithm\out\production\algorithm" cn.zzw.algorithm.Tree.ArrBinaryDemo
先序遍历结果为
1245367
中序遍历结果为
4251637
后序遍历结果为
4526731
Process finished with exit code 0