用代码了解常用的数据结构

351 阅读2分钟

代码是我学习数据结构的过程中,参考其他教程敲出来的,不讲概念,用代码直接撸数据结构~

数据结构与算法

模块 描述
01-Arrays 数组
02-Stacks
03-Queues 队列
04-LinkedList 链表
05-Recursion 递归
06-Binary-Search-Tree 二叉查找树
07-Set-and-Map 集合和映射
08-Heap 最大二叉堆

数组

  1. 线性结构
  2. 内存中连续存储
  3. 支持随机访问,复杂度O(1)
  4. 增、删非尾元素,涉及到元素的迁移,复杂度 O(n)

链表

  1. 线性结构
  2. 物理上非连续、非顺序存储
  3. 不支持随机访问,访问为头节点,复杂度 O(n)
  4. 增、删节点,复杂度 O(1)

  1. 线性表
  2. 后进先出 LIFO

队列

  1. 线性表
  2. 先进先出 FIFO

二叉查找树

  1. 非线性表
  2. 根的左边节点都小于根,右边节点都大于根
  3. 遍历方法
    1. 深度优先
      1. 先序遍历 根 > 左 > 右
      2. 中序遍历 左 > 根 > 右
      3. 后序遍历 左 > 右 > 根
    2. 广度优先

集合

  1. 无序
  2. 元素不可重复

映射

  1. 键值对

二叉堆

二叉堆是一种特殊的堆,二叉堆是完全二叉树或者近似完全二叉树。
当父节点的键值总是大于或等于任何一个子节点的键值时为"最大堆"。
当父节点的键值总是小于或等于任何一个子节点的键值时为"最小堆"。

二叉堆一般用数组来表示。如果根节点在数组中的位置是1,第n个位置的子节点分别在2n和 2n+1。因此,第1个位置的子节点在2和3,第2个位置的子节点在4和5。以此类推。这种基于1的数组存储方式便于寻找父节点和子节点。

如果存储数组的下标基于0,那么下标为i的节点的子节点是2i + 1与2i + 2;其父节点的下标是⌊floor((i − 1) ∕ 2)⌋

如下图的两个堆:

             1                                11                          
         /        \                        /        \ 
       2           3                    9           10
    /     \      /     \             /     \      /     \ 
   4      5   6       7             5      6     7      8
  / \     / \                      / \     / \
 8  9 10 11                       1   2   3   4 

将这两个堆保存在以1开始的数组中:

位置: 1 2 3 4 5 6 7 8 9 10 11
左图: 1 2 3 4 5 6 7 8 9 10 11
右图: 11 9 10 5 6 7 8 1 2 3 4

代码参见GitHub:github.com/itinytree/d…