TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解。
我们知道一颗基本的二叉树他们都需要满足一个基本性质--即树中的任何节点的值大于它的左子节点,且小于它的右子节点。按照这个基本性质使得树的检索效率大大提高。我们知道在生成二叉树的过程是非常容易失衡的,最坏的情况就是一边倒(只有右/左子树),这样势必会导致二叉树的检索效率大大降低(O(n)),所以为了维持二叉树的平衡,大牛们提出了各种实现的算法,如:AVL,SBT,伸展树,TREAP ,红黑树等等。
平衡二叉树必须具备如下特性:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。也就是说该二叉树的任何一个等等子节点,其左右子树的高度都相近。
![6959e756b6ff150c1d11bda6f1ac2220.png](https://i-blog.csdnimg.cn/blog_migrate/b32355c459d51af70c1809bbceb10c2e.jpeg)
红黑树顾名思义就是节点是红色或者黑色的平衡二叉树,它通过颜色的约束来维持着二叉树的平衡。对于一棵有效的红黑树二叉树而言我们必须增加如下规则:
1、每个节点都只能是红色或者黑色
2、根节点是黑色
3、每个叶节点(NIL节点,空节点)是黑色的。
4、如果一个结点是红的,则它两个子节点都是黑的。也就是说在一条路径上不能出现相邻的两个红色结点。
5、从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
这些约束强制了红黑树的关键性质: 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这棵树大致上是平衡的。因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树。所以红黑树它是复杂而高效的,其检索效率O(log n)。下图为一颗典型的红黑二叉树。
![be738256931d6ae81e1fcdba8f3ba6d7.png](https://i-blog.csdnimg.cn/blog_migrate/890db339f85c9e26e3b59931b03a02d3.jpeg)
Put的过程中可能涉及到左旋、右旋、着色3个过程来保持二叉树的平衡。
TreeSet底层是借助TreeMap来实现的。
![faa320163448e361fa3fee5c8b3dac4d.png](https://i-blog.csdnimg.cn/blog_migrate/98214121c1f0426dbb8b1f6f5e6d3510.jpeg)
存储时,从根节点开始比较,小的作为左叶子节点,大的作为右叶子节点。
查询时,从根节点开始查询比较。
遍历时,采用中根遍历的方式(先左、再根、后又)
![032f7b1c4a2e141a0cd5b523cce4f410.png](https://i-blog.csdnimg.cn/blog_migrate/dbeb04b54a253cf19d0bb5d0099d6634.jpeg)