CLRS笔记10、基本数据结构

数学中的集合是不变的,而算法所操作的集合是可以增大、缩小或产生其他变化的,称这种集合为动态集合
支持插入元素、删除元素和测试元素是否属于集合操作的动态集合称为字典

栈和队列
栈为后进先出LIFO,队列为先进先出FIFO
栈的INSERT操作称为PUSH,DELETE操作成为POP
队列的INSERT操作称为ENQUEUE,DELETE操作称为DEQUEUE

链表
链表L中包含一个key域和两个指针域prev和next
prev指向链表中前驱元素,next指向链表中后继元素
如果prev[x]=NIL,则元素x没有前驱节点,即x为head
如果next[x]=NIL,则元素x没有后继节点,即x为tail
属性head[L]指向head,如果head[L]=NIL,则链表L为空

单链接的链表中每个元素没有prev指针
已排序的链表的线性顺序对应着链表中各元素的key的线性顺序
环形链表的head元素的prev指向tail,tail元素的next指向head

链表的Search时间为Θ(n),Insert时间为Θ(1),Delete时间为Θ(1)

哨兵(sentinel)可以用来简化边界条件
假设链表L和一个对象nil[L],它表示NIL,但有prev和next域
这样就可以将一个双向链表变成一个带哨兵的环形双向链表,哨兵元素介于head和tail之间

有根树
对二叉树T中的元素x,p[x]表示父亲,left[x]表示左儿子,right[x]表示右儿子
如果p[x]=NIL,则x为根
T的根用root[T]表示,如果root[T]=NIL,则树T为空

如果节点的子女数无限制,则无法事先知道多少域要分配
如果节点的最多子女数为常数k,那么用child1,child2,...,childk来代替left和right域,这样会浪费大量的存储空间,因为大多数节点只有少量子女

可以用left和right-sibling来表示这种树
left[x]表示x的最左孩子,right-sibling[x]表示x紧右边的孩子
如果x没有孩子,则left[x]=NIL
如果x是其父节点的最右孩子,则right-sibling[x]=NIL

你可能感兴趣的:(数据结构,算法)