Java之数据结构与算法:顺序存储二叉树

介绍

    从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组。
在这里插入图片描述
    如上图所示,二叉树的结点以数组的方式来存放 arr : [1, 2, 3, 4, 5, 6, 6],那么如何在遍历数组时仍然可以以前序遍历,中序遍历和后序遍历的方式完成结点的遍历?那么就要介绍一下顺序存储二叉树的特点。

特点

    顺序二叉树通常只考虑完全二叉树,其特点为:
    1、第n个元素的左子节点为 2 * n + 1
    2、第n个元素的右子节点为 2 * n + 2
    3、第n个元素的父节点为 (n-1) / 2
    其中,n表示二叉树中的第几个元素(按0开始编号)

顺序存储二叉树的遍历

    一个数组Array(1,2,3,4,5,6,7),要求用二叉树前序遍历、中序遍历和后序遍历的三种方式进行遍历。

完整代码

package ArrayBinaryTree;

public class ArrayBinaryTreeDemo {
    public static void main(String[] args) {
        int arr[] = {1, 2, 3, 4, 5, 6, 7};
        ArrayBinaryTree arrayBinaryTree = new ArrayBinaryTree(arr);
        System.out.println("前序遍历:");
        arrayBinaryTree.preorder(0);
        System.out.println();
        System.out.println("中序遍历:");
        arrayBinaryTree.infixorder(0);
        System.out.println();
        System.out.println("后序遍历:");
        arrayBinaryTree.postOrder(0);
    }
}

class ArrayBinaryTree {
    private int[] arr;

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

    // 编写一个方法完成顺序存储二叉树的前序遍历
    // index表示数组的下标
    public void preorder(int index) {
        if (arr.length == 0 || arr == null) {
            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);
        }
    }

    // 编写一个方法完成顺序存储二叉树的中序遍历
    public void infixorder(int index) {
        if (arr.length == 0 || arr == null) {
            System.out.println("数组为空,不能进行前序遍历");
        }
        // 前中序遍历,先向左递归
        if (index * 2 + 1 < arr.length) {
            infixorder(index * 2 + 1);
        }
        // 再输出自己
        System.out.print(arr[index] + " ");
        //再向右递归
        if (index * 2 + 2 < arr.length) {
            infixorder(index * 2 + 2);
        }
    }

    // 编写一个方法完成顺序存储二叉树的后序遍历
    public void postOrder(int index) {
        if (arr.length == 0 || arr == null) {
            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.print(arr[index] + " ");
    }
}

结果

在这里插入图片描述

已标记关键词 清除标记
相关推荐
道01数据结构算法绪论. mp402_谈谈算法. mp4 西03_时间复杂度和空间复杂度.mp404_时间复杂度和空间复杂度2.mp405_时间复杂度和空间复杂度3.mp4险06线性表. mp407_线性表2. mp408_线性表3. mp4品09_ 线性表4. mp410_线性表5. mp411_线性表6. mp4@12_线性表7. mp413_线性表8. mp4西14. 线性表9. mp415_线性表10. mp4 16_单链表小结:腾讯面试题. mp4品17_ 线性表12. mp418_约瑟夫问题. mp4西19_ 线性表14. mp4 20_魔术师发牌问题. mp421线性表16. mp4逾22_ 线性表17. mp423_栈和队列. mp424_栈和队列2. mp4面25_ 进制转换. mp4面26_ 栈和队列4. mp427_逆波兰计算器mp4 28_中缀表达式转换为后缀表达式01. mp4逾29_ 中缀表达式转换为后缀表达式02. mp430_栈和队列7. mp431_栈和队列8. mp4 西32递归和分治思想.mp433_递归和分治思想2. mp434_汉诺塔. mp4 35_八皇后问题. mp4 四36_字符串.mp4 二37_ KMP算法. mp4 四71斐波那契查找(黄金分割法查找).38_ KMP算法2. mp4 立39_ KMP算法之NEXT数组代码原理分析. mp4二40_ KMP算法之实现及优化. mp4二41树. mp4 四42_树的存储结构. mp443_树的存储结构2. mp4四44_二艾树. mp445_二叉树2. mp4 46_二又树的存数结构. mp447_二又树的遍历. mp4 48_二丈树的建立和遍历算法. mp4四49_线索二叉树. mp4 50_线索二又树代码实现. mp4 画51_树、森林及二又树的相互转换. mp452_赫夫曼树. mp453_赫夫曼编码. mp4 四54_赫夫曼编码C语言实现. mp4口55_图. mp4 逾56_图的定义与术语2. mp457_图的存储结构. mp4 58_图的存储结构(邻接表) . mp4 59_图的存储结构(十字链表、邻接多重表、边集数组) . mp4四93堆排序的代码实现mp460_图的遍历(深度优先遍历) . mp4 品94归并排序. mp4 四61_马踏棋盘算法(骑士周游问题) . mp4 95归并排序(迭代实现) . mp4品62_图的遍历(广度优先遍历) . mp4 國96快速排序.mp4 63_最小生成树(普里姆算法) . mp4 二97快速排序的优化mp464_最小生成树( 克鲁斯卡尔算法) . mp4 立98总结回顾.mp4画65_最短路径(迪杰斯特拉算法).mp466_最短路径( 弗洛伊德算法) . mp4口67拓扑排序. mp4二68关键路径.mp4口69_查找算法. mp4 画69关键路径(代码讲解).mp4
©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页