1二叉树 --任意的
2二叉搜索树: --是二叉树经过排序的,任意一个节点都满足左节点值小于等于父节点,右节点值大于等于父节点
[
又称二叉查找树,亦称为二叉排序树
]
普通二叉树的增删改查:
增加 --直接加入
删除 --分为删除的节点无左右节点,有左节点,有右节点,有左右节点
--无左右节点,直接删除,后面的补上
--有左节点,删除后,把左节点补上
--有右节点,删除后,把右节点补上
--有左右节点,相当于删除右子节点的最左节点,方法是删除后,把最右子节点的最左节点补上
3平衡二叉树(AVL树): --平衡二叉树的自平衡指任一节点的左右子树的高度相差不超过 1 的树为平衡二叉树
-平衡二叉树的自平衡通过旋转实现,包括左旋和右旋
[
平衡二叉树,树高度最小,所以轮询时查找需要的次数最小,效率最高
增删改查:
插入和删除后,需要用旋转来维持自平衡,即始终保持任一节点的左右子树的高度相差不超过 1
自平衡的方法是:
[
4种插入节点方式LL、RR、LR、RL,用到的函数:
Tree LL_rotate(Tree node) --形参node是离操作结点最近的失衡的结点,本图中对应A --右旋
--按各个节点看,分别看对应的左节点、右节点、父节点
--最终保证是能够连起来就行了,这里的代码里处理是先处理E、A,然后处理B,最后处理A
Tree RR_rotate(Tree node) --同理,左旋
Tree LR_rotate(Tree node) --//LR型,先对失衡节点的左孩子做左旋转,归边变成LL,再对失衡节点做右旋转
--这里图错了,代码对,注意Tree LL_rotate是右旋,Tree RR_rotate是左旋
Tree RL_rotate(Tree node) --//RL型,先对失衡节点的右孩子做右旋转,归边变成RR,再对失衡节点做左旋转
--这里图对,代码也对,注意Tree LL_rotate是右旋,Tree RR_rotate是左旋
具体自平衡方法是:
总共上面4种平衡情况,插入时要对插入栈中的弹出的第一个非平衡节点进行修正,最终是转换为上面的4种自平衡方法;
删除时,需要修正栈中的所有非平衡节点,删除最终是转为插入情况最终也是调用上面的4种自平衡方法
]
]
4红黑树: --红黑树的自平衡是任意一结点到每个叶子结点的路径都包含数量相同的黑结点,所以我们叫红黑树这种平衡为黑色完美平衡
--红黑树的自平衡是通过旋转和变色实现的,旋转包括左旋和右旋
[
红黑树是一种含有红黑结点并能自平衡的二叉查找树
最上面的根节点是黑色,黑节点下面是任意的,红节点下面一定是2个黑色
任意一结点到每个叶子结点的路径都包含数量相同的黑结点,所以我们叫红黑树这种平衡为黑色完美平衡
增删改查:
[
增加和删除后,都要维持黑色自平衡,采取的具体方法是:
自平衡做法是看兄弟节点及兄弟节点的子节点整个里面有没有红色,有就通过旋转去借,没有就去父节点去借,
优先看兄弟节点有没有红色,没有再看兄弟节点的子节点有没有红色,都没有再去父节点借
借的方法是先变色再旋转,即先变色保持子节点平衡,再旋转去借,包括左旋和右旋
]
]
------------------------------------------
1.所有树中,平衡二叉树的树高度最小,所以轮询时查找需要的次数最小,效率最高
2.平衡二叉树、红黑树与二叉树的区别就是前两个增加和删除后都要保持自平衡
3.红黑树在c++中用到的有STL的map,set