首页 > 其他分享 >顺序存储二叉树

顺序存储二叉树

时间:2023-05-09 12:33:54浏览次数:42  
标签:index arr 遍历 List list 二叉树 顺序存储

顺序存储二叉树

1. 介绍

  1. 从数据存储来看,数组的存储方式和树的存储方式是可以互相转换的,即数组可以转换成树,树也可以转换成数组;
  2. 遍历数组arr时,仍然可以以前序遍历中序遍历后序遍历的方式得到二叉树。
顺序存储二叉树.png 顺序存储二叉树2.png

2. 顺序存储二叉树的特点

  • 顺序存储二叉树通常只考虑完全二叉树
  • 下标为i的元素的左子节点为:2 × i + 1;
  • 下标为i的元素的右子节点为:2 × i + 2
  • 下标为i的元素的父节点为:(n - 1) / 2

3. 代码实现顺序存储二叉树的前、中、后序遍历

package com.datastructure;

import java.util.ArrayList;
import java.util.List;

/**
 * @author SnkrGao
 * @create 2023-05-09 10:51
 */
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("前序遍历:");
        System.out.println(arrayBinaryTree.preorderTraversal());
        System.out.println("中序遍历:");
        System.out.println(arrayBinaryTree.inorderTraversal());
        System.out.println("后序遍历:");
        System.out.println(arrayBinaryTree.postorderTraversal());
    }
}

class ArrayBinaryTree {
    private int[] arr; // 用于存储数据

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

    // 重载preorderTraversal,方便调用
    public List<Integer> preorderTraversal() {
        if (arr.length == 0) {
            System.out.println("数组为空,无法遍历二叉树!");
            return new ArrayList<>();
        }

        List<Integer> resList = new ArrayList<>();
        preorderTraversal(0, resList);

        return resList;
    }

    // 重载inorderTraversal,方便调用
    public List<Integer> inorderTraversal() {
        if (arr.length == 0) {
            System.out.println("数组为空,无法遍历二叉树!");
            return new ArrayList<>();
        }

        List<Integer> resList = new ArrayList<>();
        inorderTraversal(0, resList);

        return resList;
    }

    // 重载postorderTraversal,方便调用
    public List<Integer> postorderTraversal() {
        if (arr.length == 0) {
            System.out.println("数组为空,无法遍历二叉树!");
            return new ArrayList<>();
        }

        List<Integer> resList = new ArrayList<>();
        postinorderTraversal(0, resList);

        return resList;
    }

    public List<Integer> preorderTraversal(int index, List<Integer> list) {
        // 注意是顺序存储二叉树,list中放的是下标index对应的数组中的元素
        list.add(arr[index]);
        if (2 * index + 1 < arr.length) {
            list = preorderTraversal(2 * index + 1, list);
        }
        if (2 * index + 2 < arr.length) {
            list = preorderTraversal(2 * index + 2, list);
        }
        return list;
    }

    public List<Integer> inorderTraversal(int index, List<Integer> list) {
        if (2 * index + 1 < arr.length) {
            list = inorderTraversal(2 * index + 1, list);
        }
        list.add(arr[index]);
        if (2 * index + 2 < arr.length) {
            list = inorderTraversal(2 * index + 2, list);
        }

        return list;
    }

    public List<Integer> postinorderTraversal(int index, List<Integer> list) {
        if (2 * index + 1 < arr.length) {
            list = postinorderTraversal(2 * index + 1, list);
        }
        if (2 * index + 2 < arr.length) {
            list = postinorderTraversal(2 * index + 2, list);
        }
        list.add(arr[index]);

        return list;
    }
}

标签:index,arr,遍历,List,list,二叉树,顺序存储
From: https://www.cnblogs.com/SnkrGao/p/17384535.html

相关文章

  • 二叉树
    树是有限个(n>0)元素组成的集合。树中每个结点拥有的孩子结点的个数称为该结点的度,度为0的结点为叶子结点或终端结点。树的度是树中结点的度的最大值。在有序树中,孩子结点沿用左边大、右边小的原则。二叉树是有限个(n>=0)结点的集合。可以为空,或者有一个结点作为根结点,其他结点......
  • 二叉树的线索化与遍历
    废话不说,上代码l1packagedataSrtuct.TreeAlgorithm;23importcom.sun.source.tree.Tree;45publicclassThreadBinaryTree{6publicstaticvoidmain(String[]args){7TreeNode2root=newTreeNode2(1,"M");8......
  • 线索二叉树
    (39条消息)线索二叉树,画图教你秒懂线索二叉树(线索二叉树的建立和简单操作)逻辑代码分析_IC00的博客-CSDN博客摘自这位大佬的内容,感觉写的很不错......
  • C/C++二叉树应用[2023-05-08]
    C/C++二叉树应用[2023-05-08]湖南应用技术学院实验(训)报告课程名称 数据结构与算法 课程代码 221031203 成绩评定 学院 信息工程学院 专业 物联网工程 指导老师 聂作财学生姓名 xxxx 学号 xxxxx 班级 物联xxxx实验地点 实验日期 年月日小组成员 无实验类型 □验......
  • leetcode 101 对称二叉树 Simple
    题目给你一个二叉树的根节点root,检查它是否轴对称。输入:root=[1,2,2,3,4,4,3]输出:true输入:root=[1,2,2,null,3,null,3]输出:false题解考察二叉树的遍历,使用广度优先BFS方法.BFS的关键在于使用队列,遍历树时,读到的节点先入队,再出队,出队时读取值,放入结......
  • (第26章)LinuxC本质中链表、二叉树和哈希表
    文章目录一、单链表的结构决定只能出栈,入栈1.链表的结构2.链表与数组的区别3.单链表所有基本操作代码(1)链表的插入(2)链表的查找(3)链表的删除(3)遍历整个链表(4)销毁整个链表4.习题5.C++NULL指针二、双向链表结构决定可以出队和入队1.在上面的单项链表上改改,得到双向链表2.改进双向链表:新增......
  • 平衡二叉树
    classSolution{public:boolres=true;intdfs(TreeNode*root)//返回以root为根节点的子树深度{if(root==NULL)return0;intl=dfs(root->left),r=dfs(root->right);if(abs(l-r)>1)res=false;returnmax(l......
  • 线索二叉树
    线索二叉树为什么要研究线索二叉树?如何解决上面的问题?我们使用第三种方法二叉链表当中右很多空的指针域线索二叉树定义例子线索二叉树增设了这些指针之后,会难以区分是指向孩子的指针还是指向前驱结点或者后继结点的指针所以要加上两个标志域线索二叉树的结点结......
  • 计算二叉树深度
    解决思路如果是空树,则深度为0;否则,递归计算左子树的深度记为m,递归计算右子树的深度记为n,二叉树的深度则为m与n的较大者加1。intDepth(BiTreeT){if(T==NULL)return0;else{m=Depth(T->lchild);n=Depth(T->rchild);if(m>n)return(m+1);......
  • 二叉树全分析(超详细总结建议收藏)
    个人主页:【......