算法笔记:树、堆和图
前面的文章介绍过链表,它其实就是特殊化的树,而树是特殊化的图,堆是一种特殊的树。本文将介绍这几种数据结构。
目录
- 图-Graph
- 图的定义
- 图的分类
- 图的常见算法
- DFS-深度优先搜索
- BFS-广度优先搜索
- 树-tree
- 二叉树
- 二叉树遍历
- 二叉搜索树
- 复杂度分析
- 堆-Heap
- 二叉堆
- 二叉堆常见操作
图-Graph
图的定义
图是一组顶点和一组边的集合,每条边连接一对顶点。在现实生活中,到处都会遇到图网络的概念,将问题空间表示为网络,比如计算机网络,社交网络等,由一个个节点和连接他们的边组成。
图可以表示为Graph(V, E):
1、顶点V (vertex)
- 出度:顶点的出边条数
- 入度:顶点的入边条数
2、边E (edge)
- 有向和无向
- 权重
图的分类
图主要包括以下几类:
- 无向无权图:节点之间的连接没有方向,是双向的,边没有权重(也可以说权重为1)。
- 无向有权图:节点之间的连接没有方向,有权重,比如两个节点间的物理距离。
- 有向无权图:节点之间通过有向的边连接,只能一个方向。
- 有向有权图:节点之间通过有向的边连接,有权重。
图的常见算法
DFS-深度优先搜索
深度优先搜索(Depth First Search, DFS)包括:前序遍历Preorder (Root-Left-Right),中序遍历Inorder (Left-Root-Right) 和后序遍历Postorder (Left-Right-Root)。
BFS-广度优先搜索
广度优先搜索(Breadth First Search, BFS):一层一层的遍历。
树-tree
二叉树
树是特殊化的图,由有限个节点组成。最常见的是二叉树,每个节点最多有两个子节点(左子节点,右子节点)组成,一个二叉树节点包含以下部分:
- 数据
- 指向左子节点的指针
- 指向右子节点的指针
python二叉树定义:
class BinaryTree:def __init__(self, val):self.val = valself.left = Noneself.right = None
二叉树遍历
和图的搜索一样,二叉树的搜索也可以使用以下两种遍历搜索方式:
- 深度优先搜索
- 广度优先搜索
深度优先搜索包括前序遍历,中序遍历和后序遍历,每个节点访问一次,且仅访问一次。
- 前序遍历:根左右
- 中序遍历:左根右
- 后序遍历:左右根
二叉搜索树
二叉搜索树(Binary Search Tree),也称二叉排序树、有序二叉树(Ordered Binary Tree)、排序二叉树(Sorted Binary Tree),是指一棵空树或者具有下列性质的二叉树:
- 左子树上所有结点的值均小于它的根结点的值
- 右子树上所有结点的值均大于它的根结点的值
- 左、右子树也分别为二叉搜索树
二叉搜索树的搜索、插入、移除等操作的动画演示:https://visualgo.net/zh/bst
复杂度分析
堆-Heap
堆是可以迅速找到一堆数中的最大或者最小值的数据结构,根节点最大的堆叫大顶堆或大根堆,根节点最小的堆叫做小顶堆或小根堆。常见的堆有二叉堆(Binary heap)、斐波那契堆(Fibonacci heap)等,下面主要介绍二叉堆。
二叉堆
二叉堆是一种特殊的二叉树,和二叉搜索树不同,是一颗完全二叉树。以大顶堆为例,二叉堆满足下列性质:
- 是一棵完全二叉树
- 树中任意节点的值总是 >= 其子节点的值
二叉堆一般都通过数组来实现,上图的二叉堆可表示为一维数组:[99, 90, 85, 50, 70, 60, 30, 20, 40]
。可以发现其索引具有以下关系:
- 根节点(顶堆元素):a[0]
- 索引为
i
的左孩子的索引是(2*i+1)
- 索引为
i
的右孩子的索引是(2*i+2)
- 索引为
i
的父结点的索引是floor((i-1)/2)
二叉堆常见操作
对二叉堆的常见操作包括查找(最大值)、删除(最大值)和插入,他们的时间复杂度分别为O(1)、O(logN)和O(logN)。
- 对于插入操作,元素先插入到堆的尾部,然后依次向上调整(与父节点进行比较、交换)整个堆的结构(一直到根)。
- 对于删除操作,先删除堆顶元素,接下来将堆尾元素替换到顶部,然后依次从根部向下调整(和子节点比较,将较大的子节点和它交换)整个堆的结构(一直到堆尾)
二叉堆是用于实现优先队列(priority queue)的数据结构,优先队列中的元素被赋予优先级,具有最高优先级的元素最先删除,具有最高级先出(first in, largest out)的特性。但是二叉堆不是优先队列的最优实现,插入效率较低,比如斐波那契堆(Fibonacci heap)具有更优的性能。
来源:https://en.wikipedia.org/wiki/Heap_(data_structure) --THE END--
欢迎关注公众号:「测试开发小记」及时接收最新技术文章!
算法笔记:树、堆和图相关推荐
- 数据结构与算法笔记——树(Tree)
什么是树 树的一些概念 根节点.叶子节点.父节点.子节点.兄弟节点,还有节点的高度.深度以及层数,树的高度. 你有没有发现, "树"这种数据结构真的很像我们现实生活中的" ...
- 算法笔记(七)—— 图的相关知识及算法
图的存储方式 1. 邻接表(记录关于某点的直接相邻点) 2. 邻接矩阵(一定是正方形的矩阵,对点进行编号,点到点的权值由距震中的值表示,无直接相连记为正无穷) 图的模板 unordered_map&l ...
- 《算法笔记》中文版 - 包括数组,链表,树,图,递归,DP,有序表等相关数据结构与算法的讲解及代码实现...
来源:专知本文为资源,建议阅读5分钟本文为你分享<算法笔记>中文版. https://github.com/Dairongpeng/algorithm-note 目录概览 第一节 复杂度. ...
- 算法我也不知道有没有下一个---一个题目的开端(索引堆与图)
为什么80%的码农都做不了架构师?>>> 病痛了一周,折磨来折磨去,终于还是平静了下来,现在能把上周末"贯穿"学到的最后一个基础数据结构的知识给沉淀沉淀了. ...
- 【数据结构和算法】广度优先BFS遍历图(树的层序遍历的拓展)
目录 ○树的层次遍历: 题:leetcode102: 广度优先优先遍历: 代码模板(来源:labuladong算法小抄): 图的广度优先遍历是树的层次遍历的拓展 ○树的层次遍历: 按照数的高度从上到下 ...
- 【笔记】三张图读懂机器学习:基本概念、五大流派与九种常见算法
文章目录 [笔记]三张图读懂机器学习:基本概念.五大流派与九种常见算法 Chapter 1: A look at Machine learning 1.What is it? 2.How does m ...
- 漫画算法笔记 二叉堆基本操作
漫画算法笔记 二叉堆基本操作 #include <iostream> #include <stdlib.h> #include <vector> using nam ...
- Java数据结构之链表、树、堆、图手写双向非循环链表
数据结构.手写双向非循环链表 文章目录 数据结构.手写双向非循环链表 链表 1.链表的分类 2.链表的特点 二.手写双向非循环链表 2.1方法总结 2.2 环境搭建 2.3 add 添加结点 2.3. ...
- 算法笔记(胡凡)学习笔记@Kaysen
本文旨在记录算法笔记学习过程中的收获和一些知识点,部分易错知识点只针对个人而言,CCF-CSP考试冲鸭!!! Chapter 2 C/C++快速入门(易错知识点) 2.1 基本数据类型 变量定义注意区 ...
- 明翰数据结构与算法笔记V0.8(持续更新)
文章目录 前言 数据结构 `线性表` `数组` `链表` `栈与队列` [串/字符串] 树 并查集 `二叉树` [二叉排序树/二叉搜索树] `红黑树` 红黑树操作 霍夫曼树 `堆` [大/小]根堆 可 ...
最新文章
- 本博客Matlab、FPGA代码获取方法
- More than one file was found with OS independent path 'lib/arm64-v8a/libsqlite.so'
- RabbitMQ Fanout
- ML.NET机器学习、API容器化与Azure DevOps实践(二):案例
- 如何简化React应用程序中的状态-轻松实现Redux
- 微信小程序, 解析↵换行
- Facebook 的 PHP 性能与扩展性
- c语言控制倒车雷达系统,倒车雷达控制系统设计
- linux下多线程的创建与等待详解 【转载】
- freemaker if 多个条件_小函数,大用处!巧用AND函数,避开IF函数嵌套
- Angular - FormGroup 踩坑合辑之:setValue,patchValue,reset
- 文本挖掘--LTP-cloud 分词
- java list 模糊查询_如何在java List中进行模糊查询(示例代码)
- 中国之声《国学堂》试听下载
- 艾德莱斯绸:“千年时尚”托起新产业
- Keep It Mac版
- 2021-01-28:IDEA快捷键command+/反斜杠接触不良问题
- VS2003,VS2005,VS2008 低版本打开高版本的解决方案
- 刘未鹏 - 为什么你现在就应该开始写博客
- [USACO12Jan][luogu3041] Video Game Combos [AC自动机+dp]