二十八、顺序存储二叉树

一、顺序存储二叉树的概念

从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组, 示意图如下:

在这里插入图片描述

要求:

  1. 右图的二叉树的结点,要求以数组的方式来存放 arr : [1, 2, 3, 4, 5, 6, 6]

  2. 要求在遍历数组 arr 时,仍然可以以前序遍历,中序遍历和后序遍历的方式完成结点的遍历

顺序存储二叉树的特点:

  1. 顺序二叉树通常只考虑完全二叉树

  2. 第 n 个元素的左子节点为 2 * n + 1

  3. 第 n 个元素的右子节点为 2 * n + 2

  4. 第 n 个元素的父节点为 (n-1) / 2

  5. 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

猜你喜欢

转载自blog.csdn.net/zhaozhiwei314/article/details/114280813