数据结构 - 解析二叉树的顺序存储

顺序存储结构

二叉树的存储结构可以分为两种:

数据结构 - 解析二叉树的顺序存储_第1张图片

  • 顺序存储:使用线性表(数组)存储二叉树
    数据结构 - 解析二叉树的顺序存储_第2张图片
  • 链式存储:使用链表存储二叉树

数据结构 - 解析二叉树的顺序存储_第3张图片

在上篇文章:数据结构 - 树、二叉树及四种遍历解析实现

使用链式存储二叉树,这篇完成顺序存储


顺序存储的特点

以数组的方式存放二叉树,要完成4种遍历方式,需要数组与树结点存在对应关系

顺序存储二叉树的特点

  • 顺序二叉树通常只考虑完全二叉树
  • 第n个元素的左子结点为 2 * n + 1
  • 第n个元素的右子结点为 2 * n + 2
  • 第n个元素的父结点为 (n - 1) / 2

n表示数组的下标,对应二叉树的第几个元素

数据结构 - 解析二叉树的顺序存储_第4张图片

如2,是数组下标1,左子结点为2*1+1=3,数组下标为3的元素4,右子结点为2*1+2=4,数组下标为4的元素5

当然,叶子结点不存在子结点,即数组下标越界


Java实现顺序存储

使用数组存储二叉树数据
前序遍历:先输出当前元素,再遍历左子树,最后遍历右子树

package com.company.tree;

/**
 * 顺序存储二叉树:用数组存储二叉树
 */
public class ArrBinaryTreeDemo {

    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,6,7};
        ArrBinaryTree tree = new ArrBinaryTree(arr);

        tree.preOrder();
    }
}

/**
 * 实现顺序存储二叉树
 */
class ArrBinaryTree{
    private int[] arr;

    public ArrBinaryTree(int[] arr){
        this.arr = arr;
    }

    public void preOrder(){
        this.preOrder(0);
    }

    /**
     * @param index 数组的下标
     * 顺序存储二叉树的前序遍历
     */
    public void preOrder(int index){
        //如果数组为空或者是空数组
        if (arr == null || arr.length == 0){
            System.out.println("=== 数组为空 ===");
        }
        //输出当前元素
        System.out.print(arr[index]+" ");
        //向左递归
        if ((index * 2 + 1) < arr.length){
            preOrder(index * 2 + 1);
        }
        //向右递归
        if ((index * 2 + 2) < arr.length){
            preOrder(index * 2 + 2);
        }
    }
}

二叉树1,2,3,4,5,6,7前序遍历结果为1,2,4,5,3,6,7
数据结构 - 解析二叉树的顺序存储_第5张图片

你可能感兴趣的:(数据结构和算法)