- std::stack<Type>
std::stack<int> s1; //int栈
std::stack<int> s2;
int num,value;
s1.push(10); //入栈
s1.push(11);
s1.pop(); //出栈
s1.swap(s2); //交换栈
num = s2.size(); //获取栈大小
value = s2.top(); //获取栈顶数据
- 哈希、散列函数
键值转换数组下标的函数
- 哈希碰撞 / 冲突
开链表法、再散列法
- C++ Map与HashMap
c++ 标准库的std::map
内部使用红黑树进行排序,增加、查找的时间复杂度 O(logN);
c++ 标准库的hashmap—std::unordered_map
,增加、查找的时间复杂度 O(1)。
- STL容器
顺序容器:vector,list,deque , string,stack( 适配器类), queue( 适配器类), priority queues( 适配器类)
关联容器:set, multiset,map,multimap, bitset,hash_set, hash_map, hash_multiset, hash_multimap
- 红黑树
一种自平衡的二叉查找树(BST),通过定义一些性质,将任意节点的左右子树高度差控制在规定范围内,以达到平衡状态,避免二叉树退化成单链表的情况。确保从根节点到叶节点的最长路径不超过最短路径的两倍。
红黑树的两大操作:recolor+rotation
参考:https://zhuanlan.zhihu.com/p/79980618
- 平衡二叉树(AVL树)
性质:可以是空树;若不是空树,任何一个节点的左子树与右子树都是平衡二叉树,且高度差的绝对值不能超过1。
局限性:AVL树是一种严格的平衡二叉树,执行插入或删除操作,只要不满足上面的条件,就要通过旋转来保持平衡, 而旋转是非常耗时的,由此我们可以知道AVL树适合用于插入与删除次数比较少,但查找多的情况。
假设深度为n的平衡二叉树至少有F(n)个节点,则F(n)=F(n-1)+F(n-2)+1。
- 数据结构——堆
可看成平衡二叉树,与存储结构的堆没关系;
最大堆/大顶堆:每个结点的值都大于或等于其左右子结点的值,最大值在顶节点
最小堆/小顶堆:每个结点的值都小于或等于其左右子结点的值,最小值在顶节点
- 链表插入节点
单向链表所能获取的信息只有头部节点,尾部插入节点,需遍历链表,找到后继指针为空的节点,然后将指针指向代插入节点。
若是插入到某一位置或某一值后,同样需进行遍历操作。
- 深度优先、广度优先的遍历方法
DFS:进栈、退栈,一搜到底
BFS:入队、出队,步步为营
深度优先:递归;利用栈数据结构stack(先进后出)循环实现
广度优先:无法使用递归,利用队列数据结构queue(先进先出)循环实现
- 带头链表与不带头链表
带头节点:head -> p1 -> p2 -> p3,能够快速的定位链表第一个节点
不带头节点:p1 -> p2 -> p3,对于第一个节点的操作与其他节点不一样,需特殊处理
带头结点的单链表,初始时返回的是指向头结点的指针,需要使用二维指针(指向指针的指针)
- 单链表反转
https://zhuanlan.zhihu.com/p/102908327
- 二叉搜索树
左子树中所有节点的值 < 根节点的值;右子树中所有节点的值 > 根节点的值;其左、右子树也分别为二叉搜索树。
- 搜索二维矩阵
- 判断二叉树是否对称
- 由数组构建二叉平衡树/二叉搜索树
- 二叉树最大路径
待续。。。