| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 数据结构 二叉树的顺序结构原来要这么写 -> 正文阅读 |
|
[数据结构与算法]数据结构 二叉树的顺序结构原来要这么写 |
???????二叉树的顺序结构有一个专属的名称 堆, 堆的一些概念看看数据结构里面的堆是啥:可以堆理解逻辑结构像是堆上去的,类似金字塔???树不是也这样吗,当然堆其实也是二叉树,但他是二叉树的一种变形: 完全二叉树,是基于顺序表结构存储 如图: ??????如上图那样存储如何找他的子节点呢?父节点也没存他的子节点的指针,那要如何访问呢?发明出来总是拿来用的,那么来看看大佬是如何想出来的(他有一点 静态链表 的感觉 )
如何找自己的子节点呢?其中有俩条重要的定义:
??????有了这俩个公式之前的疑惑也就烟消云散了,既然可以找到子节点,还可以找到父节点,那么好办事了,那么就介绍一个比较厉害的东西,堆排 堆排?????他是基础排序中其中之一,是一位优秀的选手,时间复杂度是N*logN (后文推导), 相比冒泡排序(n2)已经是快的没边了,废话不多说,正式介绍一下堆排 ?????堆分为俩在结构 , 大端堆 , 与小端堆 , 这是俩是啥 , 人如其名,大端堆所以的父节点一定比孩子大,小端反之 ???????这个时候可能有入要说了,我的完全二叉树这么不是这样的,数据都是大小不一的,你这个不会就是自己现象出来的逻辑结构吧,其实不是要变成上图那个模样,需要进行俩个操作建堆 ???????????排序 建堆???????建堆可谓是堆排中最重要的一步,没有他别的都是后话,因为堆排是在大端堆或者小端堆的基础进行,如上文所说,一棵树一般情况下不太会是就是大端 or 小端,甚至不太会是一棵完全二叉树可他是如何建堆的呢? ???????下文呢能会觉得有点巧,其实这些都是计算机的先辈研究出来的就像之前的那个三步翻转法,希尔算法(之后的博客会介绍) 建立基于上文的俩个公式:
如图
向下调整 ???????如果说建堆是堆排的核心,那么向下调整就是就是建堆的核心 代码
建堆代码
运行动图 请配合上面的代码食用 排序???????排序那么如何排序那?排升序是要 建大堆呢?还是建小堆?那么先看一下如何排序吧,看完就豁然开朗了 排序思想:
代码:
运行动图 ???????上面这个动图其实就可以看出排升序要建大堆,为啥呢,那么看建小堆如何走的 动图演示: 显然可以看出,建立小堆排的话就是降序 结论: 拓展???????堆其实是一个数组,那么他可以和顺序表一样尾插数据吗?当然可也,那么他如何保持有序呢??? 向上调整
如图: ???????在这个过程中有人看能要问了,他和父节点交换如果左孩子比他小这么办(升序), 那不会,你想是在有序的情况下,那么父节点一定是比他的孩子要的大 代码:
向上调整建堆 ???????既然向下调整可以建堆,那么向上调整可以建吗?他有点类似尾插 思路:
图解: 时间复杂度上文说堆的时间复杂度是O(Nlog2N),如何算呢 推导: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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 4:48:08- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |