騰訊的一道面試題:有了二叉查找樹、平衡樹爲啥還需要紅黑樹?

紅黑樹算是很難的一種數據結構吧,一般很少考察插入、刪除等具體操作步驟,如果遇到要你手寫紅黑樹的面試官,就直接告辭吧。所以,更多是會考察你對紅黑樹的理解程度,考察的最多的估計就是爲什麼有了二查找查找樹/平衡樹還需要紅黑樹這個問題了,今天,你只需要花一分鐘的時間,就知道怎麼回答這個問題了。

  1、二叉查找樹的缺點

  二叉查找樹,相信大家都接觸過,二叉查找樹的特點就是左子樹的節點值比父親節點小,而右子樹的節點值比父親節點大,如圖

  

騰訊的一道面試題:有了二叉查找樹、平衡樹爲啥還需要紅黑樹?

 

  基於二叉查找樹的這種特點,我們在查找某個節點的時候,可以採取類似於二分查找的思想,快速找到某個節點。n 個節點的二叉查找樹,正常的情況下,查找的時間複雜度爲 O(logn)。

  之所以說是正常情況下,是因爲二叉查找樹有可能出現一種極端的情況,例如

  

騰訊的一道面試題:有了二叉查找樹、平衡樹爲啥還需要紅黑樹?

 

  這種情況也是滿足二叉查找樹的條件,然而,此時的二叉查找樹已經近似退化爲一條鏈表,這樣的二叉查找樹的查找時間複雜度頓時變成了 O(n),可想而知,我們必須不能讓這種情況發生,爲了解決這個問題,於是我們引申出了平衡二叉樹。

  2、平衡二叉樹

  平衡二叉樹就是爲了解決二叉查找樹退化成一顆鏈表而誕生了,平衡樹具有如下特點

  1、具有二叉查找樹的全部特性。

  2、每個節點的左子樹和右子樹的高度差至多等於1。

  例如:圖一就是一顆平衡樹了,而圖二則不是(節點右邊標的是這個節點的高度)

  

騰訊的一道面試題:有了二叉查找樹、平衡樹爲啥還需要紅黑樹?

 

  

騰訊的一道面試題:有了二叉查找樹、平衡樹爲啥還需要紅黑樹?

 

  對於圖二,因爲節點9的左孩子高度爲2,而右孩子高度爲0。他們之間的差值超過1了。

  平衡樹基於這種特點就可以保證不會出現大量節點偏向於一邊的情況了。關於平衡樹如何構建、插入、刪除、左旋、右旋等操作這裏不在說明.

  於是,通過平衡樹,我們解決了二叉查找樹的缺點。對於有 n 個節點的平衡樹,最壞的查找時間複雜度也爲 O(logn)。

  3、爲什麼有了平衡樹還需要紅黑樹?

  雖然平衡樹解決了二叉查找樹退化爲近似鏈表的缺點,能夠把查找時間控制在 O(logn),不過卻不是最佳的,因爲平衡樹要求每個節點的左子樹和右子樹的高度差至多等於1,這個要求實在是太嚴了,導致每次進行插入/刪除節點的時候,幾乎都會破壞平衡樹的第二個規則,進而我們都需要通過左旋和右旋來進行調整,使之再次成爲一顆符合要求的平衡樹。

  顯然,如果在那種插入、刪除很頻繁的場景中,平衡樹需要頻繁着進行調整,這會使平衡樹的性能大打折扣,爲了解決這個問題,於是有了紅黑樹,紅黑樹具有如下特點:

  1、具有二叉查找樹的特點。

  2、根節點是黑色的;

  3、每個葉子節點都是黑色的空節點(NIL),也就是說,葉子節點不存數據。

  4、任何相鄰的節點都不能同時爲紅色,也就是說,紅色節點是被黑色節點隔開的。

  5、每個節點,從該節點到達其可達的葉子節點是所有路徑,都包含相同數目的黑色節點。

  例如下面的圖片(注意,圖片中黑色的、空的葉子節點沒有畫出)(圖片來自極客時間)

  

騰訊的一道面試題:有了二叉查找樹、平衡樹爲啥還需要紅黑樹?

 

  正是由於紅黑樹的這種特點,使得它能夠在最壞情況下,也能在 O(logn) 的時間複雜度查找到某個節點。至於爲什麼就能夠保證時間複雜度爲 O(logn),我這裏就不細講了,後面的文章可能會講。

  不過,與平衡樹不同的是,紅黑樹在插入、刪除等操作,不會像平衡樹那樣,頻繁着破壞紅黑樹的規則,所以不需要頻繁着調整,這也是我們爲什麼大多數情況下使用紅黑樹的原因。

  不過,如果你要說,單單在查找方面的效率的話,平衡樹比紅黑樹快。

  所以,我們也可以說,紅黑樹是一種不大嚴格的平衡樹。也可以說是一個折中發方案。

  如果我上面講的,你都懂,都能夠在面試中說出來,應該是足夠的了。我當時就是這麼回答的。

  4、總結

  所以,最後的答案是,平衡樹是爲了解決二叉查找樹退化爲鏈表的情況,而紅黑樹是爲了解決平衡樹在插入、刪除等操作需要頻繁調整的情況。

  不過,紅黑樹還有挺多其他的知識點可以考,例如紅黑樹有哪些應用場景?向集合容器中 HashMap,TreeMap 等,內部結構就用到了紅黑樹了。還有構建一棵節點個數爲 n 的紅黑樹,時間複雜度是多少?紅黑樹與哈希表在不同應該場景的選擇?紅黑樹有哪些性質?紅黑樹各種操作的時間複雜度是多少?

  如果你把這些都弄懂了,應該就差不多可以的了,後面有時間的話,我給大家詳細講一下這些題,這裏最好是要求理解,而不是死記硬背

最新整理的Java技術乾貨文檔資料:【Java核心知識點整理】涵蓋29個Java核心技術詳解,JVM,Redis,Nginx,Spring Boot,Spring Cloud,Kafka,併發編程,Tomcat,MyBatis,BAT面試題,Java技術精講視頻等。轉發+關注,私信回覆“乾貨”即可獲得免費領取方式。

掌握了這些知識點,面試時在候選人中又可以奪目不少,暴擊9999點。機會都是留給有準備的人,只有充足的準備,纔可能讓自己可以在候選人中脫穎而出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章