| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 数据结构-树与二叉树与堆 -> 正文阅读 |
|
[数据结构与算法]数据结构-树与二叉树与堆 |
C语言实现数据结构树树是一种非线性的数据结构,它是由n个有限节点组成一个具有参次关系的集合。把它叫做树是因为逻辑结构是看起来像一颗倒挂的树。 树的特点
树的表示法树不同于线性的表示,树的存储表示非常复杂,实际表示中也有很多表示方式:双亲表 孩子兄弟表示法孩子兄弟表示法的规则就是左孩子右兄弟,形象的说就是每个双亲节点带一个老大,后面的兄弟节点老二就由老大带,老三由老二带以此类推
pfirstChild指向孩子节点,pNextBrother指向兄弟节点,当没有孩子或者兄弟节点就是NULL指针。通过这个存储方式就可以找到所有节点。 二叉树二叉树就是树的每一个节点最多有2个孩子 满二叉树满二叉树就是每层节点都是最大值,即如果一个二叉树有n层,如果节点数是2n-1那么这个树就是满二叉树 完全二叉树完全二叉树就是除了最后一层其他层节点都是最大值,且倒数第二层从左到右依次存在孩子,注意满二叉树是一种特殊的完全二叉树 二叉树的性质
顺序存储完全二叉树二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树 链式存储二叉树链式存储二叉树很容易理解因为跟逻辑结构几乎完全一致 堆堆是一种特殊的完全二叉树,堆分为两种一个叫大根堆,另一个叫小根堆。大根堆是从根节点起所有的双亲节点大于等于其孩子节点,小根堆是从根节点起所有的双亲节点小于等于其孩子节点。 向下调整算法向下调整算法是根节点下的左右子树都是小堆或者都是大堆的情况下的调整算法,目的是为了让该树变为堆。以两个子树都是小堆为例子: 建堆这里以建小堆为例,建堆其实就是反复的使用向下调整算法最终成为小堆
建堆时间复杂度O(n)分析建堆的过程就是从最后一个双亲节点起到根节点对每个节点进行向下调整。向下调整的过程就是依次比较孩子与交换双亲与孩子,这个些执行的次数在最坏情况下就是层数,当是满二叉树时有n个节点时执行的次数就是log2(n+1),因为满二叉树的层数x与节点数n的关系是 2x-1 = n。所以向下调整的时间复杂度是O(logn)。由于每个节点的执行向下调整的次数都不一样,所以要分别计算再求和。 堆排序堆排序是利用堆的特性(大堆中根节点最大,小堆中根节点最小),依次来选出最大或者最小的数。这里以排升序为例子。方法是先建大堆,再将最后的节点数据与根节点交换,这样筛选出的最大数据放在最后,然后将筛选出的数据不算入堆中,此时就形成了根节点链接两个子树都是大堆,再向下调整找出最大数据,与最后数据交换,依次进行,这样就可以将最大数据依次放入最后从而形成升序。 堆排序时间复杂度O(N*logN)简单分析 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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:41:23- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |