1. 平衡二叉树
难点主要在于插入和删除上面,尤其是在破坏平衡条件的情况下,其它的都是常规操作。
对于破坏最深的那个节点,插入有四种情况:
i. LL型,插入的地方在其左子节点的左子树,此时进行一次右旋即可。
ii. RR型,插入的地方在其右子节点的右子树,此时进行一次左旋即可。
iii. LR型,插入的地方在其左子节点的右子树,此时先进行一次左旋操作,然后再进行一次右旋操作。
iX. RL型,插入的地方在其右子节点的左子树,此时先进行一次右旋操作,然后再进行一次左旋操作。
2. 红黑树
规则定义:
1. 每个节点不是红色就是黑色。
2. 根节点为黑色。
3. 如果节点为红,其子节点必须为黑。
4. 任一节点至尾端的任何路径,所含黑节点数必须相同。
根据规则4,新增节点必须为红;根据规则3,新增节点的父节点必须为黑。
3. set
所有元素都会根据元素的键值自动被排序,只有一个值,不允许有相同的值。
不可以通过set迭代器改变set的元素值,它被定义为const_iterator。
进行删除和新增操作后,原有的迭代器依然有效。
4. map
所有的元素都会根据元素的键值自动被排序,所有元素都是pair,同时拥有实值和键值,不允许有相同的键值。
不可以通过map迭代器改变map的键值,它既不是常量迭代器,也不是mutable iterator。
5. multiset和multimap
multiset的特性与set相同,唯一的差别在于它允许键值重复。multimap与map也是同样的情况。
6. hashtable
提供任何有名项的存取操作和删除操作,由于操作对象是有名项,可被视为字典结构。在插入,删除,搜寻等操作上具有“常数平均表现时间”的表现。
存储是可能会出现冲突,解决冲突的方法:线性探测,二次探测,开链等。
hashtable的桶子(bucket)与节点(node),bucket所维护的link list是hashtable的node,一个后继指针与一个值。bucket的聚合体是由vector完成,以便有动态扩充能力。
hashtable的迭代器没有后退操作,也没有定义逆向迭代器。
7. hash_set
底层以hashtable实现,所以set有自动排序,但是hash_set没有。
另外当插入的数字都小于桶的数量时,容易给人造成已排序的假象。
hash_map的描述与hash_set一样,类似的还有hash_multiset,hash_multimap。
总结: 这个知识点也不难,很好掌握的,复杂点的可能也就是平衡二叉树与红黑树的插入和删除了,看了一下,实现起来也不难,准备接下来自己写代码实现一下,然后面试的时候,能快速的手写出来,应该也是亮点吧。