十-2, Java实现顺序存储二叉树的遍历

10.1 顺序存储二叉树定义

从数据存储来看, 数组存储方式和树的存储方式可以相互转换, 即数组可以转换成树, 树也可以转换成数组. 顺序结构存储就是使用数组来存储, 一般使用数组只适合表示完全二叉树, 因为非完全二叉树会有空间的浪费.

  • 下图是树和数组对应的关系图

用数组顺序存储二叉树, 其显著特征是: (n表示数组的索引值)

    1. 在数组中index=n的元素对应的父节点为 index=(n-1)/2的元素, 向下取整;
    1. 在数组中index=n的元素对应的左子节点为 index=2*n+1的元素;
    1. 在数组中index=n的元素对应的右子节点为 index=2*n+2的元素;

举个栗子说明一下吧, 比如上图中,数组存储二叉树, int[] arr={1,2,3,4,5,6,7},

  • 对于索引值index=2的元素3, 他的
  • 父节点为 arr[(index-1)/2]=arr[0]=1,
  • 左子节点为 arr[2*index+1]=arr[5]=6,
  • 右子节点为 arr[2*index+2]=arr[6]=7;

10.2 顺序存储二叉树遍历的实现

【案例需求】

已知一个数组为:

arr = {1,2,3,4,5,6,7}

要求以二叉树前序遍历的方式对数组进行遍历,前序遍历的结果应当为:

1,2,4,5,3,6,7

【思路分析】

这个需求实际上是在考察顺序存储二叉树的重要特征:第 n 个元素的左子节点为 2n+1、右子节点为 2n+2。

根据它的特征我们可以知道:第 0 个元素 arr[0] 的左子节点为 arr[1]、右子节点为 arr[2];第 1 个元素 arr[1] 的左子节点为 arr[3]、右子节点为 arr[4] …

【代码实现】

利用顺序存储二叉树的公式,我们可以很容易写出对数组以二叉树形式的前序遍历:

package DataStrcture.binaryTreeDemo;

public class ArrBinaryTree {
    //把二叉树顺序存储到数组中
    //根据二叉树结点的关系. 我们直接访问数组的元素
    // 指定index的父节点索引为  (index-1)/2, 左子树结点 2*index+1, 右子树结点 2*index+2
    int[] arr;
    public ArrBinaryTree(int[] arr){
        this.arr = arr;
    }
    // 通过索引访问数组来前序遍历二叉树
    public void preOrder(int index){
        //
        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);
    }

    //测试方法
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,6,7};

        ArrBinaryTree tree  = new ArrBinaryTree(arr);
        tree.preOrder(0);
    }
}

在这里插入图片描述

posted @ 2022-05-26 20:31  青松城  阅读(35)  评论(0编辑  收藏  举报