二叉排序树
性质:若左子树不为空,左子树上所有节点的值小于它根节点的值;若右子树不为空,右子树上所有节点的值小于它根节点的值。
查找:根据二叉树性质,递归,若找得到返回该节点,若找不到,则返回遍历的最后一个节点。
插入:根据查找返回的结果判断是否存在等值节点,若不存在,则插入,若存在则判断该节点的值和插入值的大小从而决定插在左子树或右子树处。
删除:遍历查找到该节点,
- 若该节点是叶节点,直接删除
- 若该节点只有一个子树,则删除该节点后,把子树拼接到该节点的原父节点处
- 若该节点有两个子树,找到该节点的上一个值(前驱)或下一个值(后继),代替该节点
- 上一个节点:原节点的左子树的右子树的右子树的右子树……..
- 下一个节点:原节点的右子树的左子树的左子树的左子树……..
特殊:
二叉排序最少比较次数为1次(根节点),最多是树的深度,但二叉树形状不确定,可能是斜树。查找性能和树的形状相关。
AVL 平衡二叉树
- 是一种二叉树,每一个节点的左子树和右子树的高度差至多等于1
- 平衡因子BF:左子树高度-右子树高度
- 最小不平衡树:距离插入节点最近、根的平衡因子的绝对值大于1的子树
- 插入:根据BF左旋右旋,遇到最小不平衡树根节点和子树节点的BF值符号不同还需要调整顺序再旋转
- 查找插入删除:O(logn)
B树 多路查找树
- 子节点数大于2,每个节点可以存储多个元素
- 所有叶子节点位于同一层次
每个节点可能在不同页面
2-3树
每个节点都有2、3个或没有孩子。每个节点最多2个元素- B+树
- 所有分支节点是索引,节点仅含其子树中最大、最小的关键字,有n个子树就有n个关键字
- 所有叶子节点包含所有关键字信息,及指向这些关键字记录的指针,叶子节点本身按照关键字大小顺序连接
- 查找(适合范围查找)
+ 遍历的时候让所有节点每个元素只访问一次
+ 随机查找:和B树查找方式相同,但要在叶节点处找到关键字信息 - 插入删除都在叶子节点上进行
二叉树 树 森林
树转二叉树
- 加线:所有兄弟节点之间加上一条线
- 去线:去掉和除第一个子节点之外子节点之间的连线
二叉树转树
- 加线:把所有节点的左子节点的右子节点、左子节点的右子节点的右子节点等等等连接起来
- 去线:删除原二叉树中所有节点的和其右节点的连线
森林转为二叉树
- 每个树都转为二叉树
- 第一个二叉树不动,从第二个二叉树开始转
二叉树转为森林
- 去掉所有和右节点之间的连线删除
- 把分离出二叉树转成树
参考
《大话数据结构》