数据结构——顺序存储二叉树

顺序存储二叉树

一:顺序存储二叉树概念

从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组
前序遍历
要求:

  1. 上图的二叉树的结点,要求以数组的方式来存取:arr[] = [1,2,3,4,5,6,7]
  2. 要求在遍历数组arr时,仍然可以以前序遍历,中序遍历,后序遍历的方式来完成结点的遍历。

二:顺序存储二叉树的特点

  1. 顺序存储二叉树通常只考虑完全二叉树
  2. 第n个元素的左子节点为:2*n+1;
  3. 第n个元素的右子节点为:2*n+2;
  4. 第n个元素的父节点为:(n-1)/2
  5. n:表示二叉树中的第几个元素(从0开始)

三:顺序二叉树遍历

/*
    顺序存储二叉树
 */
public class ArrBinaryTree {

    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,6,7};
        BinaryTreeArr binaryTreeArr = new BinaryTreeArr(arr);
        System.out.println("前序遍历");
        binaryTreeArr.preOrderArr(0);
        System.out.println("中序遍历");
        binaryTreeArr.infixOrder(0);
        System.out.println("后序遍历");
        binaryTreeArr.postOrder(0);
    }

}

class BinaryTreeArr{
    //创建数组
    private int[] arr;

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

    //前序遍历
    public void preOrderArr(int index){
        //判断传进来的数组是否符合条件
        if (arr==null||arr.length == 0){
            System.out.println("数组为空");
        }

        //前序输出当前元素
        System.out.println(arr[index]);

        //左子节点
        if ((index*2+1)<arr.length){
            //左递归
            preOrderArr(index*2+1);
        }

        //右子节点
        if ((index*2+2)<arr.length){
            preOrderArr(index*2+2);
        }
    }


    //中序遍历
    public void infixOrder(int index){
        //判断数组是否符合标准
        if (arr==null||arr.length == 0){
            System.out.println("数组为空!");
        }

        //左子节点
        if ((index*2+1)<arr.length){
            //左递归
            infixOrder(index*2+1);
        }

        //中输出
        System.out.println(arr[index]);

        //右节点
        if ((index*2+2)<arr.length){
            //递归
            infixOrder(index*2+2);
        }
    }


    //后续遍历
    public void postOrder(int index){
        //判断
        if (arr==null||arr.length == 0){
            System.out.println("数组为空");
        }
        //左子结点
        if ((index*2+1)<arr.length){
            //递归
            postOrder(index*2+1);
        }

        //右子节点
        if ((index*2+2)<arr.length){
            postOrder(index*2+2);
        }

        //输出
        System.out.println(arr[index]);
    }
}

发布了24 篇原创文章 · 获赞 5 · 访问量 2052

猜你喜欢

转载自blog.csdn.net/weixin_43288447/article/details/104312703