树、二叉树、查找算法总结

一、思维导图

二、重要概念笔记

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);
    }
}
posted @ 2020-04-26 17:58  烟雨萧煜  阅读(143)  评论(0编辑  收藏  举报