前面的文章介绍过链表,它其实就是特殊化的树,而树是特殊化的图,堆是一种特殊的树。本文将介绍这几种数据结构。

目录

  • 图-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),是指一棵空树或者具有下列性质的二叉树:

  1. 左子树上所有结点的值均小于它的根结点的值
  2. 右子树上所有结点的值均大于它的根结点的值
  3. 左、右子树也分别为二叉搜索树

二叉搜索树的搜索、插入、移除等操作的动画演示: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--

欢迎关注公众号:「测试开发小记」及时接收最新技术文章!

算法笔记:树、堆和图相关推荐

  1. 数据结构与算法笔记——树(Tree)

    什么是树 树的一些概念 根节点.叶子节点.父节点.子节点.兄弟节点,还有节点的高度.深度以及层数,树的高度. 你有没有发现, "树"这种数据结构真的很像我们现实生活中的" ...

  2. 算法笔记(七)—— 图的相关知识及算法

    图的存储方式 1. 邻接表(记录关于某点的直接相邻点) 2. 邻接矩阵(一定是正方形的矩阵,对点进行编号,点到点的权值由距震中的值表示,无直接相连记为正无穷) 图的模板 unordered_map&l ...

  3. 《算法笔记》中文版 - 包括数组,链表,树,图,递归,DP,有序表等相关数据结构与算法的讲解及代码实现...

    来源:专知本文为资源,建议阅读5分钟本文为你分享<算法笔记>中文版. https://github.com/Dairongpeng/algorithm-note 目录概览 第一节 复杂度. ...

  4. 算法我也不知道有没有下一个---一个题目的开端(索引堆与图)

    为什么80%的码农都做不了架构师?>>>    病痛了一周,折磨来折磨去,终于还是平静了下来,现在能把上周末"贯穿"学到的最后一个基础数据结构的知识给沉淀沉淀了. ...

  5. 【数据结构和算法】广度优先BFS遍历图(树的层序遍历的拓展)

    目录 ○树的层次遍历: 题:leetcode102: 广度优先优先遍历: 代码模板(来源:labuladong算法小抄): 图的广度优先遍历是树的层次遍历的拓展 ○树的层次遍历: 按照数的高度从上到下 ...

  6. 【笔记】三张图读懂机器学习:基本概念、五大流派与九种常见算法

    文章目录 [笔记]三张图读懂机器学习:基本概念.五大流派与九种常见算法 Chapter 1: A look at Machine learning 1.What is it? 2.How does m ...

  7. 漫画算法笔记 二叉堆基本操作

    漫画算法笔记 二叉堆基本操作 #include <iostream> #include <stdlib.h> #include <vector> using nam ...

  8. Java数据结构之链表、树、堆、图手写双向非循环链表

    数据结构.手写双向非循环链表 文章目录 数据结构.手写双向非循环链表 链表 1.链表的分类 2.链表的特点 二.手写双向非循环链表 2.1方法总结 2.2 环境搭建 2.3 add 添加结点 2.3. ...

  9. 算法笔记(胡凡)学习笔记@Kaysen

    本文旨在记录算法笔记学习过程中的收获和一些知识点,部分易错知识点只针对个人而言,CCF-CSP考试冲鸭!!! Chapter 2 C/C++快速入门(易错知识点) 2.1 基本数据类型 变量定义注意区 ...

  10. 明翰数据结构与算法笔记V0.8(持续更新)

    文章目录 前言 数据结构 `线性表` `数组` `链表` `栈与队列` [串/字符串] 树 并查集 `二叉树` [二叉排序树/二叉搜索树] `红黑树` 红黑树操作 霍夫曼树 `堆` [大/小]根堆 可 ...

最新文章

  1. 本博客Matlab、FPGA代码获取方法
  2. More than one file was found with OS independent path 'lib/arm64-v8a/libsqlite.so'
  3. RabbitMQ Fanout
  4. ML.NET机器学习、API容器化与Azure DevOps实践(二):案例
  5. 如何简化React应用程序中的状态-轻松实现Redux
  6. 微信小程序, 解析↵换行
  7. Facebook 的 PHP 性能与扩展性
  8. c语言控制倒车雷达系统,倒车雷达控制系统设计
  9. linux下多线程的创建与等待详解 【转载】
  10. freemaker if 多个条件_小函数,大用处!巧用AND函数,避开IF函数嵌套
  11. Angular - FormGroup 踩坑合辑之:setValue,patchValue,reset
  12. 文本挖掘--LTP-cloud 分词
  13. java list 模糊查询_如何在java List中进行模糊查询(示例代码)
  14. 中国之声《国学堂》试听下载
  15. 艾德莱斯绸:“千年时尚”托起新产业
  16. Keep It Mac版
  17. 2021-01-28:IDEA快捷键command+/反斜杠接触不良问题
  18. VS2003,VS2005,VS2008 低版本打开高版本的解决方案
  19. 刘未鹏 - 为什么你现在就应该开始写博客
  20. [USACO12Jan][luogu3041] Video Game Combos [AC自动机+dp]

热门文章

  1. break在java语言中什么意思,c语言中break是什么意思?
  2. 正态随机变量的概率计算
  3. 朋友圈一杠中间一个点_做好“五个一”,打造吸引人的朋友圈门面
  4. SAP770系统FI模块配置(定义留存收益 科目)
  5. 迪赛智慧数——折线图(阶梯折线图):历年天猫双十一全网销售额
  6. 音乐网站平台项目数据库设计
  7. C++ 校园足球联赛 题解
  8. 软件借用RSA增加注册功能
  9. window环境下部署hbase(仅测试环境)
  10. 单片机中如何通过程序控制震动马达震动