1.1 概述
TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解:
- 红黑树的每个节点都只能是红色或者黑色
- 根节点是黑色
- 每个叶节点(NIL节点,空节点)是黑色的、如果一个结点是红的,则它两个子节点都是黑的、也就是说在一条路径上不能出现相邻的两个红色结点
- 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
TreeMap继承AbstractMap,实现NavigableMap、Cloneable、Serializable三个接口。其中AbstractMap表明TreeMap为一个Map即支持key-value的集合, NavigableMap(更多)则意味着它支持一系列的导航方法,具备针对给定搜索目标返回最接近匹配项的导航方法 。
1.2详解
我们主要通过对于treemap的put和remove方法分析来了解treemap:
红黑树插入新节点的时候:
- 若新插入的节点N没有父节点
则直接当做根据节点插入即可,同时将颜色设置为黑色。 - 若父节点为黑色
这种情况新节点N同样是直接插入,同时颜色为红色,由于根据规则四它会存在两个黑色的叶子节点,值为null。同时由于新增节点N为红色,所以通过它的子节点的路径依然会保存着相同的黑色节点数。 - 若父节点P和P的兄弟节点U都为红色
对于这种情况若直接插入肯定会出现不平衡现象。怎么处理?P、U节点变黑、G节点变红。这时由于经过节点P、U的路径都必须经过G所以在这些路径上面的黑节点数目还是相同的。但是经过上面的处理,可能G节点的父节点也是红色,这个时候我们需要将G节点当做新增节点递归处理。 - 若父节点P为红色,叔父节点U为黑色或者缺少,且新增节点N为P节点的右孩子
对于这种情况我们对新增节点N、P进行一次左旋转。再进行第五步操作。 - 父节点P为红色,叔父节点U为黑色或者缺少,新增节点N为父节点P左孩子
对于这种情况先已P节点为中心进行右旋转,在旋转后产生的树中,节点P是节点N、G的父节点。但是这棵树并不规范,它违反了规则4,所以我们将P、G节点的颜色进行交换,使之其满足规范。开始时所有的路径都需要经过G其他们的黑色节点数一样,但是现在所有的路径改为经过P,且P为整棵树的唯一黑色节点,所以调整后的树同样满足规范5。