本章涉及的两个主题都与结构化有着莫大联系。
作者给出的定义非常贴切:
数据结构是存储数据的方式,按照不同的方式存储数据,可以对数据做不同的高效操作。
下面按照二叉搜索树、满二叉堆和并查集的顺序对各结构和相关习题进行介绍,由于我数据结构掌握地相对好一些,就不做较为初级的科普了
“二叉树”是大学课程中继“链表”后会学习的第二个数据结构,它和链表都是一类递归的结构,即节点本身包含节点的指针:
struct node { int val; node *lch, *rch; };
另外二叉树与图结构中的树不一样,它有利于高效地进行查找;为了防止随着特殊数据的插入导致结构“链化”,查找效率降低,在此基础上还衍生出了各类自平衡二叉树结构:红黑树、Splay树、Treap树和替罪羊树等等;这些结构能通过旋转或者其他骚操作让二叉树的查找插入删除维持在\(O(logn)\)的复杂度内
书中给出的就是普通二叉树实现一个无重复元素的集合的例子,重点放在insert、find和remove操作的实现上;
bool find(node *p, int x) { if(p == NULL) return false; else if(x == p->val) return true; else if(x < p->val) return find(p->lch, x); else return find(p->rch, x); } node* insert(node *p, int x) { if(p == NULL) { node *q = new node; q->val = x; q->lch = q->rch = NULL; return q; } if(p->val == x) return p; else if(x < p->val) p->lch = insert(p->lch, x); else p->rch = insert(p->rch, x); return p; } node* remove(node *p, int x) { if(p == NULL) return NULL; else if(x < p->val) p->lch = remove(p->lch, x); else if(x > p->val) p->rch = remove(p->rch, x); else if(p->lch == NULL) { node *q = p->rch; delete p; return q; } else if(p->lch->rch == NULL) { node *q = p->lch; q->rch = p->rch; delete p; return q; } else { node *q; for(q = p->lch; q->rch->rch != NULL; q = q->rch); node *r = q->rch; q->rch = r->lch; r->lch = p->lch; r->rch = p->rch; delete p; return r; } return p; }