之前学了ds,但是时间长了后基本都忘光了,现在学算法设计与分析基础的时候用到一些基本的数据结构都想不起来了,今天就来写一下一些常用的数据结构,包括他们的概念,常用用法等等。

链表(Linked List)

链表应该是最和数组差不多常用的一个数据结构了,链表的基本结构如下所示:
常用的数据结构
链表由一系列的Node组成,每个Node包括一个指针域和一个数据域,每个指针域指向下一个Node,数据域就用来存放数据。链表插入删除等操作也不复杂,插入一般从头上插入,因为我们一般用Head来表示一个Linked List,所以不知道尾部在哪里,只知道头部在哪里所以就插在头部就好了,如果想要删除某一个Node的话,就只要把该Nodei后面的Nodei+1指向Nodei-1,同时释放下Nodei的空间就行了。基本的指针就是这样了,当然其他还有很多拓展了,比如循环指针,双向指针等等。

队列(Queue)

队列也是十分常用的数据结构,队列只要记住一个特性就好了,先进先出(FIFO),如下图所示:
常用的数据结构
队列一些基本操作相对就更简单一些了:
enqueue: 从队列尾部添加一个元素
dequeue: 从队列头部删除一个元素
队列就可以由上述提到的链表或者数组来实现

栈(Stack)

栈是和队列相反的一种数据结构,栈也只要记住一个特性就好了:先进后出(FILO),这种在生活中可能不常见,不过还是有这种情况的,比如学生上交作业,老师批改作业时就是栈的方式拿作业本的。
常用的数据结构
栈的一些基本操作包括:
压入push:往Stack里增加一个数据;
弹出pop从Stack里弹出一个数据;
栈的操作不像队列,增加数据是在队尾,弹出数据是在对头,栈的数据出入都是在栈顶的。
栈的实现也一样可以通过数组或链表。

树 (Tree)

参考:http://www.sohu.com/a/276752110_663371
树相对比较复杂,有比较多的定义。
节点的度:如果树是从上往下的方向,那么根没有入度,只有出度;叶子节点只有入度没有出度,其余节点既有入度又有出度,入度只能是1,出度可能是1或2.

叶节点:出度为0的节点称为叶节点;

分支节点:出度不为0的节点;

父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;

子节点:一个节点含有的子树的根节点称为该节点的子节点;

兄弟节点:具有相同父节点的节点互称为兄弟节点;

树的度:一棵树中,最大的节点的出度称为树的度;

节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;

树的高度或深度:树中节点的最大层次;

堂兄弟节点:双亲在同一层的节点互为堂兄弟;

节点的祖先:从根到该节点所经分支上的所有节点;

子孙:以某节点为根的子树中任一节点都称为该节点的子孙。

森林:由m(m>=0)棵互不相交的树的集合称为森林;

有序树:子树有序的树,兄弟节点是有顺序的,不可以交换次序的,比如二叉查找树就是一种有序树。

无序树:不考虑子树的顺序;
常用的数据结构
树的常用操作包括遍历,有3种遍历方式:
前序遍历(preorder traversal):根在访问左右子树之前被访问;
中序遍历(inorder traversal):根在访问左子树后,但在访问右子树前被访问;
后序遍历(postorder traversal):根在访问左右子树之后被访问;
树的实现可以通过链表,每一个Node包括n个指针域指向孩子节点,包括一个数据域存放数据;
通常来说,我们用到的树是带有某种性质的树。
接下来看几种常用的树:

二叉树

二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。
二叉树中还有几种更常用的数据结构:
满二叉树
除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。
一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。
完全二叉树:对结点按照上至下、从左到右的次序进行存储
常用的数据结构
图片来自:https://www.cnblogs.com/privilege/p/11216116.html

完全二叉树也就是说前面n-1层是满二叉树,最后一层从左到右一次填上Node。

二叉查找树(英语:Binary Search Tree),也称为二叉搜索树、有序二叉树(ordered binary tree)或排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树:

  • 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
  • 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
  • 任意节点的左、右子树也分别为二叉查找树;
  • 没有键值相等的节点。
    二叉查找树搜索是很快的,因为可以迅速的与根节点判断大小,比根节点大就到右子树去找,比根节点小就在左子树找,很快速,有点像二分法。
    但是我们可以想到当二叉查找树深度很深的时候效率就没那么高了,最差情况就是二叉查找树是一根长长的链条,那么就和遍历一遍一样了。因此我们常常希望二叉查找树深度不深,也就是希望它平衡,那么对平衡的的不同理解,也就生出了不同的拓展,比如AVL树和红黑树
    平衡二叉树(AVL树)
    当且仅当任何节点的两棵子树的高度差不大于1的二叉树;
    红黑树
    红黑树也是一种自平衡的二叉查找树。
  • 每个结点要么是红的要么是黑的。(红或黑)
  • 根结点是黑的。 (根黑)
  • 每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。 (叶黑)
  • 如果一个结点是红的,那么它的两个儿子都是黑的。 (红子黑)
  • 对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。(路径下黑相同)
    保证红黑树满足它的基本性质,就是在调整数据结构自平衡。
    常用的数据结构
    参考:https://blog.csdn.net/wannuoge4766/article/details/83998377

堆(Heap)

堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:

  • 堆中某个节点的值总是不大于或不小于其父节点的值;
  • 堆总是一棵完全二叉树。
    通常我们听到的是最大堆和最小堆,最大堆就是每一个节点总是大于所有子孙的这样一个堆,最小堆就是相反。所以说最大堆的根就是整个堆的最大值了。
    常用的数据结构
    上图就是一个最大堆了。

上面说的树就是一种特殊的图。图相对复杂,有一些基本概念。
图中最基本的组成元素就是顶点(Vertex)和边(edge),图根据是否有方向可以分为无向图和有向图。
图在计算机里常用两种存储方式:邻接矩阵和邻接表
常用的数据结构常用的数据结构
图的遍历包括两种常见的方式:广度优先遍历(BFS)和深度优先遍历(DFS)。
广度优先遍历,顾名思义就是像水的波纹一样,一圈一圈的扩散出去遍历,比如先遍历上面图片中的额A,然后B,C,D,一次类推。
深度优先遍历,顾名思义就是先一条路探到底,比如先遍历A,然后B,E,I,F,依次类推。

相关文章:

  • 2021-12-15
  • 2022-01-16
猜你喜欢
  • 2021-08-02
  • 2021-11-23
相关资源
相似解决方案