一、思维导图
二、重要概念笔记
1.哈希表的构造:
哈希函数:
除留余数法:h(k)=m%p(p取小于m的最大素数)
哈希冲突的解决方法:
拉链法:所有有冲突的元素在一条链表上。
开放定址法:
线性探测法:冲突发生时,顺序查看表中下一单元,直到找出一个空单元或查遍全表。
二次探查法:冲突发生时,在表的左右进行跳跃式探测,比较灵活。
2.二叉树的性质
1:深度为k的二叉树至多有2^k-1个结点(k>=1)。
2:在二叉树的第i层上至多有2^i-1个结点(i>=1)。
3:对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。
4:具有n个结点的完全二叉树的深度为(log2n)+1。
3.树的存储结构
双亲表示法:当算法中需要在树结构中频繁地查找某结点的父结点时,使用双亲表示法最合适。
孩子表示法:适用于查找孩子结点。
孩子兄弟表示法:方便实现树和二叉树的相互转换。
4.二叉树的层次遍历
void Levelorder(BiTree BT) {
BiTree p;
BTqueue q;
int i = 0;
if (BT == NULL) {
cout << "NULL";
return;
}
Crequeue(q);
Enqueue(q, BT);
while (!Emptyqueue(q)) {
Dequeue(q, p);
if (i)cout << " ";
i = 1;
cout << p->data ;
if (p->lchild != NULL) {
Enqueue(q, p->lchild);
}
if (p->rchild != NULL) {
Enqueue(q, p->rchild);
}
}
}
三、疑难问题及解决方案
二叉排序树的删除操作:
void DeleteBST(BiTree& T, ElemType key) {
if (T == NULL) return;
else
{
if (key < T->data) return DeleteBST(T->lchild, key);
else if (key > T->data) return DeleteBST(T->rchild, key);
else Delete(T);
}
}
void Delete(BiTree& T) {
BiTNode* q;
if (T->rchild == NULL) {
q = T;
T = T->lchild;
free(q);
}
else if (T->lchild == NULL) {
q = T;
T = T->rchild;
free(q);
}
else
Delete1(T, T->lchild);
}
void Delete1(BiTree* T, BiTree& r) {
BiTNode* q;
if (r->rchild != NULL)
Delete1(T, r->rchild);
else {
T->data = r->data;
q = r;r = r->lchild;
free(q);
}
}