树,二叉树和算法总结

一、思维导图

二、重要概念的笔记

1、性质1:在二叉树的第i层上至多有2i-1个结点(i≥1)。
性质2:深度为k的二叉树上至多含2k-1个结点(k≥1)。
性质3:对任何一棵二叉树,若它含有n0个叶子结点、n2个度为2的结点,则必存在关系式:n0=n2+1。
2、孩子兄弟表示法:可以将树转换为二叉树。(左孩子,右兄弟)
3、二叉排序树的删除:
如果删除的是叶子直接删除即可。
如果删除结点的左子树或右子树为空,“移花接木”:将左子树或右子树接到双亲上结点的位置上。
如果删除结点的左右子树都不空,“偷梁换柱”:借左子树上最大的结点(直接前驱)替换被删除的结点,然后变为删除左子树最大结点的情况。(或者借用右子树
上最小结点(直接后继)然后删除之)。
4、AVL树的构建:首先得知道哪里不平衡,先判断是什么型的,然后进行平衡旋转;遇到较难的RL与LR型可以进行转换成LL或RR型再平衡旋转,使问题简化;
5、B+树的关键字在叶子结点上,
6、哈希表解决冲突的办法:
首先确定哈希函数,(最优应为除留余数法)
然后选定方法,可以为开放定址法或为拉链法;
然后建立哈希表;

三、疑难问题及解决方案

二叉排序树的删除操作因为要考虑的要素比较多,导致错误的次数较多
解决方案:在老师的讲解以及伪代码的书写让我逐渐学会;
二叉排序树删除的部分代码:

bool DeleteBST(BiTree *T, TElemType key)
{
    if (!*T)        //空树。查无此结点。
        return false;
    else if (key == (*T)->data)
    {
        Delete(T);
        return true;
    }
    else if (key < (*T)->data)
    {
        return DeleteBST(&((*T)->lchild), key);
    }
    else
    {
        return DeleteBST(&((*T)->rchild), key);
    }
}
 
/*
 * 删除*T指向的结点
 */
bool Delete(BiTree *T)
{
    BiTree L;
 
    //*T既没有左孩子,又没有右孩子,为叶子结点
    if (!(*T)->lchild && !(*T)->rchild)
        *T = NULL;
    //*T只有右孩子
    else if (!(*T)->lchild)
        *T = (*T)->rchild;
    //*T只有左孩子
    else if (!(*T)->rchild)
        *T = (*T)->lchild;
    //*T既有左孩子,又有右孩子
    else
    {
        L = (*T)->lchild;//L指向被删除结点的左子树
 
        //寻找L的最右孩子
        while (L->rchild)
            L = L->rchild;
 
        //把*T的右子树接到左子树最右孩子的右子树上。
        L->rchild = (*T)->rchild;
        //*T的左子树直接作为*T父结点的子树
        *T = (*T)->lchild;
    }
    return true;
}

四、总结

这次对树以及二叉树的回顾,让我的一些比较模糊的概念变得清晰起来,同时加深了对各类树基本性质,对一些常见的题型能基本上了解解题方法;

posted @ 2020-04-26 17:47  林毅()  阅读(196)  评论(0编辑  收藏  举报