<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 1923字,需瀏覽 4分鐘

           ·

          2021-04-24 20:55

          大家好,我是帥地。


          在校招面試的時候,還是有好幾次被問到了紅黑樹,不過對于紅黑樹,一般是不可能讓你寫代碼實現(xiàn)了,如果遇到這樣的面試官,那就只能說倒霉了。


          在我面試的過程中,被考察的最多的估就是為什么有了二查找查找樹/平衡樹還需要紅黑樹這個問題了。


          面試官一般都會讓你說一說紅黑樹的應(yīng)用 + 于其他數(shù)據(jù)結(jié)構(gòu)的比較,只要你掌握我今天的這篇文章,那么應(yīng)付文中的這個面試題,應(yīng)該就很穩(wěn)的了。

          1、二叉查找樹的缺點

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


          基于二叉查找樹的這種特點,我們在查找某個節(jié)點的時候,可以采取類似于二分查找的思想,快速找到某個節(jié)點。n 個節(jié)點的二叉查找樹,正常的情況下,查找的時間復(fù)雜度為 O(logn)。

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


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

          2、平衡二叉樹

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

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

          2、每個節(jié)點的左子樹和右子樹的高度差至多等于1。

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

          。

          對于圖二,因為節(jié)點9的左孩子高度為2,而右孩子高度為0。他們之間的差值超過1了。

          平衡樹基于這種特點就可以保證不會出現(xiàn)大量節(jié)點偏向于一邊的情況了。關(guān)于平衡樹如何構(gòu)建、插入、刪除、左旋、右旋等操作這里不在說明,具體可以看我之前寫的一篇文章:【漫畫】以后在有面試官問你AVL樹,你就把這篇文章扔給他。

          于是,通過平衡樹,我們解決了二叉查找樹的缺點。對于有 n 個節(jié)點的平衡樹,最壞的查找時間復(fù)雜度也為 O(logn)。

          3、為什么有了平衡樹還需要紅黑樹?

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

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

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

          2、根節(jié)點是黑色的;

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

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

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

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

          正是由于紅黑樹的這種特點,使得它能夠在最壞情況下,也能在 O(logn) 的時間復(fù)雜度查找到某個節(jié)點。至于為什么就能夠保證時間復(fù)雜度為 O(logn),我這里就不細講了,后面的文章可能會講。

          不過,與平衡樹不同的是,紅黑樹在插入、刪除等操作,不會像平衡樹那樣,頻繁著破壞紅黑樹的規(guī)則,所以不需要頻繁著調(diào)整,這也是我們?yōu)槭裁创蠖鄶?shù)情況下使用紅黑樹的原因。

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

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

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

          4、總結(jié)

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

          不過,紅黑樹還有挺多其他的知識點可以考,例如紅黑樹有哪些應(yīng)用場景?向集合容器中 HashMap,TreeMap 等,內(nèi)部結(jié)構(gòu)就用到了紅黑樹了。還有構(gòu)建一棵節(jié)點個數(shù)為 n 的紅黑樹,時間復(fù)雜度是多少?紅黑樹與哈希表在不同應(yīng)該場景的選擇?紅黑樹有哪些性質(zhì)?紅黑樹各種操作的時間復(fù)雜度是多少?

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

          瀏覽 51
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  99久久婷婷豆花 | 北条麻妃 无码 在线 视频 | 日韩不卡天堂 | 7777精品视频 | www爆操美女骚穴视频www |