❤️算法系列之顺序二叉树的实现(前序遍历中序遍历后序遍历)❤️

Posted Roninaxious

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了❤️算法系列之顺序二叉树的实现(前序遍历中序遍历后序遍历)❤️相关的知识,希望对你有一定的参考价值。


【❤️算法系列之二叉树的实现(包含前序、中序、后序遍历以及节点的查找和删除)❤️】https://blog.csdn.net/Kevinnsm/article/details/120531258?spm=1001.2014.3001.5501

1.何为顺序二叉树

顺序二叉树本质上维护了一个数组,也就是通过数组存储实现的,适用于完全二叉树

2.顺序二叉树的特点

💫(1)顺序二叉树通常只考虑完全二叉树
💫(2)第n个元素的左子节点为 2 * n + 1
💫(3)第n个元素的右子节点为 2 * n + 2
💫(4)第n个元素的父节点为 (n - 1) / 2

💮n为数组中元素的下标

3.顺序二叉树的遍历

3.1.前序遍历

    protected void preOrder(int n) {
        if (arr == null || arr.length == 0) {
            System.out.println("数组为空,无法遍历!");
        }
        if (n > arr.length - 1) {
            return;
        }
        System.out.print(arr[n]+"->");
        preOrder(2 * n + 1);
        preOrder(2 * n + 2);
    }

3.2.中序遍历

/**
     * 中序遍历
     * @param n 0
     */
    protected void infixOrder(int n) {
        if (arr == null || arr.length == 0) {
            System.out.println("数组为空,无法遍历!");
        }
        if (n > arr.length - 1) {
            return;
        }
        preOrder(2 * n + 1);
        System.out.println(arr[n] + "->");
        preOrder(2 * n + 2);
    }

3.3.后序遍历

    /**
     * 后序遍历
     * @param n 0
     */
    public void sufOrder(int n) {
        if (arr == null || arr.length == 0) {
            System.out.println("数组为空,无法遍历!");
        }
        if (n > arr.length - 1) {
            return;
        }
        preOrder(2 * n + 1);
        preOrder(2 * n + 2);
        System.out.println(arr[n] + "->");
    }

全代码

/**
 * 顺序存储二叉树  维护了一个数组
 * [1,2,3,4,5,6,7],以二叉树得形式进行遍历
 * 左节点:2 * n + 1
 * 右节点:2 * n + 2
 * n为根元素得数组下标
 */
public class SeqBinaryTree {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 6, 7};
        System.out.println("前序遍历结果如下:");
        ArrBinaryTree binaryTree = new ArrBinaryTree(arr);
        binaryTree.preOrder(0);
        System.out.println();
        System.out.println("中序遍历结果如下:");
        binaryTree.infixOrder(0);
        System.out.println();
        System.out.println("后续遍历结果如下:");
        binaryTree.sufOrder(0);
    }


}
class ArrBinaryTree {
    private int[] arr;
    public ArrBinaryTree(int[] arr) {
        this.arr = arr;
    }
    /**
     * 前序遍历
     *
     * @param n 0
     */
    protected void preOrder(int n) {
        if (arr == null || arr.length == 0) {
            System.out.println("数组为空,无法遍历!");
        }
        if (n > arr.length - 1) {
            return;
        }
        System.out.print(arr[n]+"->");
        preOrder(2 * n + 1);
        preOrder(2 * n + 2);
    }

    /**
     * 中序遍历
     * @param n 0
     */
    protected void infixOrder(int n) {
        if (arr == null || arr.length == 0) {
            System.out.println("数组为空,无法遍历!");
        }
        if (n > arr.length - 1) {
            return;
        }
        preOrder(2 * n + 1);
        System.out.println(arr[n] + "->");
        preOrder(2 * n + 2);
    }

    /**
     * 后序遍历
     * @param n 0
     */
    public void sufOrder(int n) {
        if (arr == null || arr.length == 0) {
            System.out.println("数组为空,无法遍历!");
        }
        if (n > arr.length - 1) {
            return;
        }
        preOrder(2 * n + 1);
        preOrder(2 * n + 2);
        System.out.println(arr[n] + "->");
    }
}

4.顺序二叉树的注意点

💙1.对于完全二叉树,使用数组来实现节省空间,对于其他类型的二叉树就不适用了。
💙2.对于顺序二叉树底层维护了一个数组,这个数组需要提前确定大小,所以增删节点会很麻烦.

以上是关于❤️算法系列之顺序二叉树的实现(前序遍历中序遍历后序遍历)❤️的主要内容,如果未能解决你的问题,请参考以下文章

算法系列之线索化二叉树,前序线索化中序线索化后序线索化以及遍历~

二叉树的前序遍历中序遍历后序遍历

数据结构(13)---二叉树之链式结构(前序遍历, 中序遍历, 后序遍历, 层序遍历)

JS中的二叉树遍历

二叉树的前序中序后序遍历顺序详解

前序中序后续遍历二叉树的非递归实现