树,二叉树,查找算法总结
思维导图
重要概念
树
孩子结点
结点的子树
二叉树的孩子结点只有两个,称为左子树、右子树
父结点
结点的根
兄弟结点
同父结点的结点统称为兄弟结点
叶子结点
又称终端结点,是树的最底层结点,无子树,度为0
结点的度
结点的子树个数
树的高度
树中最大的结点层
树的度
树中最大的结点度
森林
互不相交的树的集合
二叉树
二叉树的形态分为左右斜树、满二叉树、完全二叉树
二叉树的存储结构有顺序存储结构和链式存储结构,但顺序存储结构仅适用于满二叉树或完全二叉树
在二叉树的第 i 层上至多有2^(i-1)个结点。
深度为 k 的二叉树上至多含 2^k-1 个结点(k≥1)
对任何一棵二叉树,若它含有n0个叶子结点、n2个度为 2 的结点,则必存在关系式:n0= n2+1。
n个结点的二叉树中,完全二叉树具有最小的路径长度。
二叉树的遍历方法
前序遍历:根结点->左子树->右子树
中序遍历:左子树->根结点->右子树
后序遍历:左子树->右子树->根结点
层次遍历:一层层从左到右借助队列进行顺序遍历
二叉平衡树
二叉平衡树的左右两个子树的高度差的绝对值不超过1
插入方式 破坏平衡原因 旋转方式
LL 在A的左子树根节点的左子树上插入节点而平衡被破坏 对A右旋
RR 在A的左子树根节点的左子树上插入节点而平衡被破坏 对A左旋
LR 在A的左子树根节点的左子树上插入节点而平衡被破坏 先左旋后右旋
RL 在A的左子树根节点的左子树上插入节点而平衡被破坏 先右旋后左旋
查找算法
静态查找
顺序查找:通过顺序表或线性链进行查找,时间复杂度O(n)
折半查找:通过有序表二分法进行查找,时间复杂度O(logn)
哈希表查找
1.在记录的存储地址和它的关键字之间建立一个确定的对应关系;这样不经过比较,一次存取就能得到元素。
2.哈希函数——在记录的关键字与记录的存储位置之间建立的一种对应关系。是从关键字空间到存储位置空间的一种映象。
3.哈希表——应用哈希函数,由记录的关键字确定记录在表中的位置信息,并将记录根据此信息放入表中,这样构成的表叫哈希表。
4.Hash查找适合于关键字可能出现的值的集合远远大于实际关键字集合的情形。
5.更适合查找,不适合频繁更新
常用的哈希函数
直接定址法:仅适合于:地址集合的大小 == 关键字集合的大小
除留余数法:取关键字被某个不大于哈希表表长m的数p除后所得余数作哈希地址,即H(key)=key%p,p<=m。
解决冲突
开放定址法:当冲突发生时,形成一个探查序列;沿此序列逐个地址探查,直到找到一个空位置(开放的地址),将发生冲突的记录放到该地址中。即Hi=(H(key)+di) % m,i=1,2,……k(k<=m-1),H(key)哈希函数,m哈希表长,di增量序列。
线性探测再散列:di=1,2,3,…,m-1
二次探测再散列:di=12,-12,22,-22,…,±k2(k<=m/2)
链地址法:将所有关键字为同义词的记录存储在一个单链表中,并用一维数组存放头指针。拉链法中可取α≥1,且结点较大时,拉链法中增加的指针域可忽略不计,因此节省空间。一旦发生冲突,在当前位置给单链表增加结点就行。
Hash查找效率
装填因子=表中记录数/表容量
疑难问题
搞不清楚装填因子和表长的关系,表长不是由除数决定的吗?