顺序存储二叉树
从数据结构来看,数组存储方式与树的存储方式可以相互转换,也就是说数组可以转换为树,树也可以转换为数组。
顺序存储二叉树的思路:
(1)顺序存储二叉树通常情况下只考虑完全二叉树
(2)第n个元素的左子结点为:2 * n + 1
(3)第n个元素的右子结点为:2 * n + 1
(4)第n个元素的父结点为:(n - 1) / 2
(5)n:表示二叉树的第几个元素
顺序存储二叉树遍历实现代码:
package com.struct;
public class ArrBinaryTreeDemo {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
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();
System.out.println();
}
}
//顺序化存储二叉树
class ArrBinaryTree
{
private int[] arr;
public ArrBinaryTree(int[] arr) {
this.arr = arr;
}
//重写前序遍历
public void preOrder()
{
this.preOrder(0);
}
//重写中序遍历
public void infixOrder()
{
this.infixOrder(0);
}
//重写后序遍历
public void postOrder()
{
this.postOrder(0);
}
//前序遍历
public void preOrder(int index)
{
if (arr == null || arr.length == 0)
{
System.out.println("数组为空,不能按照二叉树的前序遍历");
return;
}
//输出结点
System.out.print(arr[index] + "\t");
//向左递归前序遍历
if (index * 2 + 1 < arr.length)
preOrder(index*2+1);
//向右递归前序遍历
if (index*2+2<arr.length)
preOrder(index*2+2);
}
//中序遍历
public void infixOrder(int index)
{
if (arr == null || arr.length == 0)
{
System.out.println("数组为空,不能按照二叉树的前序遍历");
return;
}
//向左递归中序遍历
if (index * 2 + 1 < arr.length)
infixOrder(index*2+1);
//输出结点
System.out.print(arr[index] + "\t");
//向右递归中序遍历
if (index*2+2<arr.length)
infixOrder(index*2+2);
}
//后序遍历
public void postOrder(int index)
{
if (arr == null || arr.length == 0)
{
System.out.println("数组为空,不能按照二叉树的前序遍历");
return;
}
//向左递归后序遍历
if (index * 2 + 1 < arr.length)
postOrder(index*2+1);
//向右递归后序遍历
if (index*2+2<arr.length)
postOrder(index*2+2);
//输出结点
System.out.print(arr[index] + "\t");
}
}