顺序存储二叉树(java代码实现)
将二叉树(一般为完全二叉树)的所有节点以数组的形式进行存放,在遍历数组时,我们仍然可以以二叉树的前中后次序进行遍历;
顺序存储二叉树的特点
1.通常情况下我们只考虑完全二叉树
2.第n个元素的左子节点为: 2 * n + 1
3.第n个元素的右子节点为: 2 * n + 2
4.第n个元素的父节点为:(n - 1) / 2
注意:其中的n为二叉树中的第几个元素(从0来时计数)
图解:
代码:
package com.bingym.tree;
public class ArrayBinaryTreeDemo {
/*
* 顺序存储二叉树的代码实现:
* 以数组的形式存放二叉树(一般情况为完全二叉树)
* 在遍历的时候:可以用二叉树的遍历方式(前中后序方式)进行遍历
* 案例:arr = {1,2,3,4,5,6,7}-----里面存放的是二叉树的节点,要求分别以前中后序方式遍历该二叉树
* */
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7};
ArrayBinaryTree arrayBinaryTree = new ArrayBinaryTree(arr);
System.out.println("顺序存储二叉树的前序遍历为:");
arrayBinaryTree.preOrder();
System.out.println("顺序存储二叉树的中序遍历为:");
arrayBinaryTree.infixOrder();
System.out.println("顺序存储二叉树的后序遍历为:");
arrayBinaryTree.postOrder();
}
}
//定义一个顺序存储二叉树
class ArrayBinaryTree {
//成员变量:内部包含一个存放节点的数组
public int[] arr;
//定义构造器:初始化数组
public ArrayBinaryTree(int[] arr) {
this.arr = arr;
}
//重载preOder()
public void preOrder() {
preOrder(0);
System.out.println();
}
//定义前序遍历的方法
public void preOrder(int index) {
//首先判断数组是否为空或者数组的长度是否为0
if (arr == null || arr.length == 0) {
System.out.println("该二叉树内部数组为空,不能进行前序遍历...");
return;
}
//打印该节点信息
System.out.print(arr[index] + " ");
//左递归进行节点的遍历
if ((2 * index + 1) < arr.length) { //在左子节点不越界的情况下进行遍历
preOrder(2 * index + 1);
}
//右递归进行节点的遍历
if ((2 * index + 2) < arr.length) { //在右子节点不越界的情况下进行遍历
preOrder(2 * index + 2);
}
}
//重载infixOder()
public void infixOrder() {
infixOrder(0);
System.out.println();
}
//定义中序遍历的方法
public void infixOrder(int index) {
//首先判断数组是否为空或者数组的长度是否为0
if (arr == null || arr.length == 0) {
System.out.println("该二叉树内部数组为空,不能进行前序遍历...");
return;
}
//左递归进行节点的遍历
if ((2 * index + 1) < arr.length) { //在左子节点不越界的情况下进行遍历
infixOrder(2 * index + 1);
}
//打印该节点信息
System.out.print(arr[index] + " ");
//右递归进行节点的遍历
if ((2 * index + 2) < arr.length) { //在右子节点不越界的情况下进行遍历
infixOrder(2 * index + 2);
}
}
//重载postOder()
public void postOrder() {
postOrder(0);
System.out.println();
}
//定义后序遍历的方法
public void postOrder(int index) {
//首先判断数组是否为空或者数组的长度是否为0
if (arr == null || arr.length == 0) {
System.out.println("该二叉树内部数组为空,不能进行前序遍历...");
return;
}
//左递归进行节点的遍历
if ((2 * index + 1) < arr.length) { //在左子节点不越界的情况下进行遍历
postOrder(2 * index + 1);
}
//右递归进行节点的遍历
if ((2 * index + 2) < arr.length) { //在右子节点不越界的情况下进行遍历
postOrder(2 * index + 2);
}
//打印该节点信息
System.out.print(arr[index] + " ");
}
}