1. 簡單的介紹下紅黑樹?
a. 紅黑樹是一種平衡二叉查找樹(簡稱平衡樹,常見的平衡樹有AVL,紅黑樹。AVL樹的性質為:每個結點的左右子樹的高度之差的絕對值最多為1。)
//add: 如果再問你什么是平衡樹,回答:最大深度不大於log(n),n是樹的節點個數。
b. Java集合中的TreeSet和TreeMap,C++ STL中的set、map,以及Linux虛擬內存的管理,都是通過紅黑樹去實現的。
//add1:為啥TreeSet和TreeMap不用其他平衡樹,比如AVL? 答:雖然紅黑樹操作的復雜度和AVL是相同的,但是紅黑樹從不平衡調整到平衡所需操作更少,統計性能更優。 //add2:TreeSet和HashSet的比較? 答:1) TreeSet是用紅黑樹實現的,操作復雜度O(log(n)),HashSet使用哈希+拉鏈去沖突法實現的,平均操作復雜度O(1)。所以一般查找HashSet更快。 2) TreeSet因為是紅黑樹,本質是一顆二叉排序樹,所以元素是排好序的。同時也需要使用Comparator接口,實現 compare方法。(不寫的話會使用默認的,沒有默認就會拋異常) HashSet則需要重寫該對象對應類的equals方法和hashCode()方法(不寫的話也會使用默認的)。 3) HashSet可以放入null,但只能放入一個null。TreeSet不能放入null。(TreeSet需要排序,你怎么和一個null比較大小)
c. 紅黑樹的各項操作(插入、刪除、查找等)復雜度都為log(n)
d. 紅黑樹的五大特征
1)節點要么為紅色,要么為黑色。(不然為啥叫紅黑樹;)) 2)根節點為黑色。 3)葉子節點為黑色。 (這兩個簡直送分,最上面和最下面都是黑的) 4)每個紅色節點的左右孩子都是黑色。 (保證了從根節點到葉子節點不會出現連續兩個紅色節點) 5)從任意節點到其每個葉子節點的所有路徑,都包含相同數目的黑色節點。(4,5是使得紅黑樹為平衡樹的關鍵)