08.Java数据结构与算法分析~顺序存储二叉树

08.Java数据结构与算法分析~顺序存储二叉树

本文是上一篇文章的后续,详情点击该链接

顺序存储二叉树的概念

       从数据存储来看,数组存储方式和树的存储方式可以相互转换。

       也就是说,数组可以转换成树,树也可以转换成数组。

顺序存储二叉树的特点:

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

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

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

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

n表示二叉树中第几个元素(按0开始编号)

定义Tree接口

public interface Tree {
    //先序遍历
    void PreOrder();
    //中序遍历
    void InfixOrder();
    //后序遍历
    void PostOrder();
}

ArrBinaryTree实现类

public class ArrBinaryTree implements Tree {
    private Object[] arr;    //存储数据结点的数组

    //构造器传值
    public ArrBinaryTree(Object[] arr){
        this.arr = arr;
    }
    
    //前序遍历
    public void PreOrder(int index){
        //如果数组为空,或者数组长度 = 0
        if(arr == null || arr.length == 0){
            throw new NullPointerException();
        }
        //输出当前元素
        System.out.print(arr[index] + " ");
        //向左递归遍历
        if((index * 2 + 1) < arr.length) {
            PreOrder(2 * index + 1);
        }
        //向右递归遍历
        if((index * 2 + 2) < arr.length){
            PreOrder(index * 2 + 2);
        }
    }

    //中序遍历
    public void InfixOrder(int index) {
        //如果数组为空,或者数组长度 = 0
        if(arr == null || arr.length == 0){
            throw new NullPointerException();
        }
        //向左递归遍历
        if((index * 2 + 1) < arr.length) {
            InfixOrder(2 * index + 1);
        }
        //输出当前元素
        System.out.print(arr[index] + " ");
        //向右递归遍历
        if((index * 2 + 2) < arr.length){
            InfixOrder(index * 2 + 2);
        }
    }

    //后序遍历
    public void PostOrder(int index) {
        //如果数组为空,或者数组长度 = 0
        if(arr == null || arr.length == 0){
            throw new NullPointerException();
        }
        //向左递归遍历
        if((index * 2 + 1) < arr.length) {
            PostOrder(2 * index + 1);
        }
        //向右递归遍历
        if((index * 2 + 2) < arr.length){
            PostOrder(index * 2 + 2);
        }
        //输出当前元素
        System.out.print(arr[index] + " ");
    }

    //先序,中序,后序遍历 方法重载
    public void PreOrder(){
        this.PreOrder(0);
    }

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

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

测试

    public static void main(String[] args) {
        Integer[]arr = {1,2,3,4,5,6,7};
        Tree tree = new ArrBinaryTree(arr);
        //前序遍历
        tree.PreOrder();System.out.println();
        //中序遍历
        tree.InfixOrder();System.out.println();
        //后序遍历
        tree.PostOrder();
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章