数据存储的常用结构有:栈、队列、数组、链表和红黑树
栈(stack)
- 特点:先进后出,后进先出
- 存储数据叫做压栈或者入栈
- 删除数据叫做弹栈或者出栈
队列
特点:先进先出,后进后出
数组
- 数组是内存中连续的存储区域,分成若干等分区域,存在索引(可以根据索引快速计算出元素的地址:索引*单位长度)
- 特点:查询快,增删慢(需要重新new一个数组,迁移元素)
链表
- 链表在内存中不连续,元素是游离存储的。每个元素会记录下个元素的地址
- 特点是增删快,查询慢(针对于首尾元素,速度极快,一般是双链表)。
红黑树
了解红黑树,首先了解树
树具有的特点:
- 每一个节点有零个或者多个子节点
- 没有父节点的节点称之为根节点,一个树最多有一个根节点。
- 每一个非根节点有且只有一个父节点
名词 | 含义 |
---|---|
节点 | 指树中的一个元素 |
节点的度 | 节点拥有的子树的个数,二叉树的度不大于2 |
叶子节点 | 度为0的节点,也称之为终端结点 |
高度 | 叶子结点的高度为1,叶子结点的父节点高度为2,以此类推,根节点的高度最高 |
层 | 根节点在第一层,以此类推 |
父节点 | 若一个节点含有子节点,则这个节点称之为其子节点的父节点 |
子节点 | 子节点是父节点的下一层节点 |
兄弟节点 | 拥有共同父节点的节点互称为兄弟节点 |
二叉树
- 二叉树:binary tree 永远只有一个根节点,是每个结点不超过2个节点的树 。
查找二叉树/排序二叉树
- 查找二叉树/排序二叉树:小的左边,大的右边,但是可能树很高,性能变差。
平衡二叉树
- 为了做排序和搜索会进行左旋和右旋实现平衡查找二叉树,让树的高度差不大于1
旋转
在构建一棵平衡二叉树的过程中,当有新的节点要插入时,检查是否因插入后而破坏了树的平衡,如果是,则需要做旋转去改变树的结构。
旋转的方式分为左旋和又旋:
当左枝过高不平衡是右旋,如果右旋后依然不平衡可以先左旋再右旋
右旋反之
红黑树
- 红黑树(就是基于红黑规则实现了自平衡的排序二叉树):
树尽量的保证到了很矮小,但是又排好序了,性能最高的树。 - 在进行元素插入的时候, 每一次插入完毕以后,使用黑色规则进行校验,如果不满足红黑规则,就需要通过变色,左旋和右旋来调整树,使其满足红黑规则;
红黑树的特性:
- 跟节点必须是黑色。
- 每个节点或者是黑色,或者是红色。
- 每个叶节点(NIL)是黑色。 (这里叶节点是指为空(NIL或NULL)的叶节点)
- 如果一个节点是红色的,则它的子节点必须是黑色的。
- 对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点
- 红黑树的增删查改性能都好!!!