IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 2021-09-09 -> 正文阅读

[数据结构与算法]2021-09-09

数组顺序储存二叉树

根据数组顺序,将数组元素储存进一个完全二叉树。
至于为什么是完全二叉树,因为完全二叉树转化成有序数组后才最有效的利用数组空间,不至于浪费。
提示:记录,复习,学习

一、具体步骤

1.思路分析

一个有序数组,对应的完全二叉树:
一个二叉树的节点(下标index),对应的父节点下标:(index-1)/2,对应的值index+1
同样,该节点(下标index)的左子节点下标:2index+1
右子节点的下标2
index+2
先根据数组从index=0开始,根据子节点的规律,在数组中得到相应的子节点下标,然后根据下标的值得到节点的值,通过getparent(val)得到父节点,然后将待添加节点添加到父节点左右,先左后右。
顺序储存的二叉树
引用于尚硅谷截图(哈哈哈)

数组方法

代码如下(示例):

//完全二叉树,顺序储存二叉树
    //给定符合完全二叉树的数组,顺序储存进二叉树
    public void SequentialStorage(int[] arr, int index) {
        if (arr == null || arr.length == 0) {
            System.out.println("数组为空");
            return;
        }
        //添加节点,节点的值两个参数
        head.addOrder(new Node(arr[index], (index + 1) + ""), arr[index]);
        //根据数组下标遍历数组,顺序储存进二叉树
        if (index * 2 + 1 < arr.length)
            SequentialStorage(arr, index * 2 + 1);
        if (index * 2 + 2 < arr.length)
            SequentialStorage(arr, index * 2 + 2);
    }

2.加入二叉树的方法

代码如下(示例):

 //顺序储存
    public void addOrder(Node node, int index) {
        //获得父节点
        Node parent = getParent(index);
        //根节点没有父节点
        if (parent == null) {
            System.out.println("无父节点");
            return;
        } else
            System.out.println(index + "的父节点是:" + parent);
        if (parent.left == null) {
            parent.setLeft(node);
            return;
        } else {
            if (parent.right == null) {
                parent.setRight(node);
                return;
            }
        }
    }

该处使用先左后右顺序添加

得到父节点方法

//返回父节点
    public Node getParent(int val) {
        //val-1为下标,下标为0的是根节点
        if (val - 1 == 0)
            return null;
        //return find(val /2 )这里index是节点值
        return find((val - 1 - 1) / 2 + 1);
        //节点值为val
    }

find(Node node)

 //前序查找
    public Node find(int val) {

        /*
        //前序
        System.out.println("次数");
        if (val == this.val)
            return this;
        */

        //temp用来标记是否找到了
        //如果找到了才退出该方法,找不到temp==null,会继续向右递归
        //进行查找
        Node temp = null;
        if (this.left != null)
            temp = this.left.find(val);
        //左边找到了就不往右边找了,省时间
        if (temp != null)
            return temp;

//        /*
        //中序
//        System.out.println("次数");
        if (val == this.val)
            return this;
//         */

        //右边不为空,右递归前序查找
        if (this.right != null)
            temp = this.right.find(val);
        //这不用判断temp是否是null,找到就返回了
        //找不到就是真的找不到了

        /*
        //后序
        if (temp != null)
            return temp;
        System.out.println("次数");
        if (val == this.val)
            return this;
        */

        return temp;

    }

前中序列遍历均可


总结

学习过程中的思路和一点点想法,后续还待优化改进啊,感谢韩老师的视频引导。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-10 11:06:46  更:2021-09-10 11:08:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:42:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码