树
树,这种结构在计算机领域应用非常广泛,便于管理和查找。
树的关键在与“分治”思想。我理解的分治思想就是将事务进行分类归纳,使得具有规律或者特征的来把数据或者事务联系起来,这样在查找或者使用的时候就可以有目的的忽略不需要浪费精力的部分,从而提高效率。
例如:文件系统(B+树),DB索引(B+树、哈希树),treemap(红黑树),堆(完全二叉树)
二叉树
每个节点只有两个子节点。
二叉查找树,关键点是树的深度。
堆结构就是一个完全二叉树,(gc)。
二叉树有很多种:红黑树,AVL树,堆
AVL树
1.本身首先是一棵二叉搜索树。
2.带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。
堆
1、二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数
2、第 h 层所有的结点都连续集中在最左边
红黑树
树的旋转
1、左旋
图片引用http://www.cnblogs.com/yangecnu/p/Introduce-Red-Black-Tree.html
2、右旋
图片引用http://www.cnblogs.com/yangecnu/p/Introduce-Red-Black-Tree.html
红黑树性质
1、任何一个节点都有颜色,黑色或者红色
2、根节点是黑色的
3、红节点的子节点必须为黑节点
4、任何一个节点向下遍历到其子孙的叶子节点,所经过的黑节点个数必须相等
5、空节点被认为是黑色的
6、新插入节点所带颜色为红色,需要根据以上性质进行调整
二叉查找树的遍历、查找,还有基于两者的排序、contain等方法的实现,对于所有的类型的二叉查找树都是相同的。
插入
对于二叉查找树的插入操作基本操作都是一样的,都是先通过二分查找法找到所需要插入数据对应的位置,插入节点。关键的不同是:不同的查找树在插入节点后,为了保持相应的性质所需进行的在平衡操作。
1、对于新节点的插入有如下三个关键地方:
(1)插入新节点总是红色节点 。
(2)如果插入节点的父节点是黑色, 能维持性质 。
(3)如果插入节点的父节点是红色, 破坏了性质. 故插入算法就是通过重新着色或旋转, 来维持性质 。
由此得出:只有新插入节点的父节点为红色节点的时候需要来进行调整。
2、红黑树插入
(1)(2)(3)
3、红黑树插入的再平衡操作
父节点为红色节点的场景分析
(1)(2)(3)
删除
删除的过程也同插入操作,首先通过二分查找找到对应的节点,删除后再平衡
1、将红黑树当作一颗二叉查找树,将节点删除。
(1) 被删除节点没有儿子(叶节点),直接将该节点删除就OK了。
(2) 被删除节点只有一个儿子,直接删除该节点,并用该节点的唯一子节点顶替它的位置与被删节点的父节点相连。
(3) 被删除节点有两个儿子,先找出它的后继节点;然后把“它的后继节点的内容”复制给“该节点的内容”;之后,删除“它的后继节点”。在这里,后继节点相当于替身,在将后继节点的内容复制给"被删除节点"之后,再将后继节点删除。这样就巧妙的将问题转换为"删除后继节点"的情况了,下面就考虑后继节点。 在"被删除节点"有两个非空子节点的情况下,它的后继节点只可能是没有儿子的叶节点或者只有一个右儿子。若没有儿子,则按"情况① "进行处理;若只有一个儿子,则按"情况② "进行处理。
(1)(2)(3)(4)