日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

面试官:了解二叉树吗,平衡二叉树,红黑树?

發(fā)布時(shí)間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面试官:了解二叉树吗,平衡二叉树,红黑树? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

面試過程中,多多少少會(huì)問一點(diǎn)數(shù)據(jù)結(jié)構(gòu)(二叉樹)的問題,今天我們來復(fù)習(xí)一下二叉樹的相關(guān)問題,文末總結(jié)。

1. 二叉樹的由來

在 jdk1.8 之前,HashMap 的數(shù)據(jù)結(jié)構(gòu)由「數(shù)組+鏈表」組成,數(shù)組是 HashMap 的主體,鏈表是為了解決 Hash 沖突引入的,正常的數(shù)據(jù)存放是直接存在數(shù)組中,但如果發(fā)生 Hash 沖突就會(huì)以鏈表的形式進(jìn)行存儲(chǔ),而在 jdk1.8之后,當(dāng)鏈表的長度超過 8 之后,將會(huì)轉(zhuǎn)換成紅黑樹經(jīng)常存儲(chǔ)…

相信這一段 HashMap 的描述,一定是大家所熟知的,其實(shí)細(xì)品之后,我們可以從這段描述中發(fā)掘這些信息。

數(shù)組 > 鏈表 > 樹。

正所謂有需求就會(huì)有發(fā)展,我們來看看為什么在有「數(shù)組+鏈表」的情況下,還出來個(gè)樹結(jié)構(gòu)。

數(shù)組優(yōu)點(diǎn):
  • 簡單易用,隨機(jī)訪問性強(qiáng)
  • 無序數(shù)組插入速度很快,效率為O1
  • 有序數(shù)組查找速度較快,效率為O(logN)
數(shù)組缺點(diǎn):
  • 插入和刪除效率低
  • 數(shù)組大小固定,無法動(dòng)態(tài)擴(kuò)容
鏈表優(yōu)點(diǎn):
  • 大小不固定,無限擴(kuò)容
  • 插入和刪除速度很快
鏈表缺點(diǎn):
  • 查詢效率低,不支持隨機(jī)查找,必須從第一個(gè)開始遍歷
  • 在鏈表非表頭的位置進(jìn)行插入、刪除很慢,效率為O(N)

從數(shù)組到鏈表的優(yōu)缺點(diǎn),我們可以看出是各有千秋,不能很準(zhǔn)確的說鏈表比數(shù)組就一定要高效,而正是因?yàn)檫@種關(guān)系的存在,所以二叉樹出現(xiàn)了。

所以二叉樹的由來:二叉樹整合了數(shù)組和鏈表的優(yōu)缺點(diǎn),使得插入、刪除、查找的速度都很快,效率比較高。

2. 二叉樹是什么

二叉樹是樹形結(jié)構(gòu)的一個(gè)重要類型,也是眾多數(shù)據(jù)結(jié)構(gòu)的基石。

樹有很多類型,每個(gè)節(jié)點(diǎn)最多只能有兩個(gè)子節(jié)點(diǎn)的叫二叉樹。

所以,二叉樹的特性就是每個(gè)節(jié)點(diǎn)的子結(jié)點(diǎn)不允許超過兩個(gè)。

3. 二叉查找樹

二叉查找樹是一種特殊的二叉樹,二叉查找樹的特點(diǎn)就是,左子樹節(jié)點(diǎn)比父節(jié)點(diǎn)小,右子樹節(jié)點(diǎn)值比父節(jié)點(diǎn)大。

極端現(xiàn)象

二叉查找樹有一種極端的存在,二叉樹的大部分子節(jié)點(diǎn)都比父節(jié)點(diǎn)值小,然后導(dǎo)致所有的數(shù)據(jù)偏向左側(cè),進(jìn)而退化成鏈表,如下圖所示:

我們使用二叉樹的目的是因?yàn)槠湫矢哂阪湵聿樵?#xff0c;但這種退化為鏈表的現(xiàn)象很顯然就突兀,怎么辦呢。

所以為了解決二叉樹退化成一棵鏈表就引入了平衡二叉樹。

4. 平衡二叉樹

平衡二叉樹,又被稱為AVL樹,是為了解決二叉樹退化成一棵鏈表而誕生的。

平衡二叉樹特點(diǎn):

  • 擁有二叉查找樹的全部特性。
  • 每個(gè)節(jié)點(diǎn)的左子樹和右子樹的高度差至多等于1。

其中左右子樹的高度差是通過左旋右旋實(shí)現(xiàn)的。

下面是一個(gè)平衡二叉樹和非平衡二叉樹的圖:

到底是如何判斷高度差的呢?我們可以來數(shù)節(jié)點(diǎn)最長連接數(shù),比如左側(cè)節(jié)點(diǎn)最長連接數(shù)為「3 > 4 > 5」3個(gè)節(jié)點(diǎn),右側(cè)為「9」一個(gè)節(jié)點(diǎn),所以高度差為2。

再比如下面一個(gè)平衡二叉樹:

左側(cè)最長連接點(diǎn)為「3(9) > 7 >11」,即高度為2,右側(cè)最長連接點(diǎn)為「14(16) > 15 > 18 > 11」,即高度為4,所以高度差為2。

為了維持二叉樹的平衡,平衡二叉樹是通過左旋、右旋來保證的,從大的方向旋轉(zhuǎn)過程又被分為單旋轉(zhuǎn)和雙旋轉(zhuǎn),總之,旋轉(zhuǎn)的作用就是避免出現(xiàn)節(jié)點(diǎn)偏向一邊的情況,具體左旋、右旋操作在這就不詳細(xì)闡述了。

但是平衡二叉樹這種高度差為 1 的要求太嚴(yán)格了,尤其是對(duì)于頻繁刪除、插入的場景非常浪費(fèi)時(shí)間…

5. 紅黑樹

對(duì)于那種頻繁刪除、插入的場景,平衡二叉樹的調(diào)整過程顯然是存在性能問題的,所以為了解決這個(gè)問題,進(jìn)而又引入了紅黑樹。

紅黑樹的特點(diǎn):

  • 具有二叉樹所有特點(diǎn)。
  • 每個(gè)節(jié)點(diǎn)只能是紅色或者是黑色。
  • 根節(jié)點(diǎn)只能是黑色,且黑色根節(jié)點(diǎn)不存儲(chǔ)數(shù)據(jù)。
  • 任何相鄰的節(jié)點(diǎn)都不能同時(shí)為紅色。
  • 紅色的節(jié)點(diǎn),它的子節(jié)點(diǎn)只能是黑色。
  • 從任一節(jié)點(diǎn)到其每個(gè)葉子的所有路徑都包含相同數(shù)目的黑色節(jié)點(diǎn)。

紅黑樹如下圖所示:

概括為:紅黑樹所有的根節(jié)點(diǎn)都是黑色的的空節(jié)點(diǎn),也就是根節(jié)點(diǎn)不存數(shù)據(jù);任何相鄰的節(jié)點(diǎn)都不能同時(shí)為紅色,紅色節(jié)點(diǎn)是被黑色節(jié)點(diǎn)隔開的,每個(gè)節(jié)點(diǎn),從該節(jié)點(diǎn)到達(dá)其可達(dá)的葉子節(jié)點(diǎn)是所有路徑,都包含相同數(shù)目的黑色節(jié)點(diǎn)。

正是因?yàn)檫@種特點(diǎn),紅黑樹不同于平衡樹的操作,紅黑樹不會(huì)因?yàn)椴迦搿h除等操作追求絕對(duì)的平衡,它的旋轉(zhuǎn)次數(shù)少,插入最多兩次旋轉(zhuǎn),刪除最多三次旋轉(zhuǎn),所以對(duì)于搜索、插入、刪除操作較多的情況下,紅黑樹的效率是優(yōu)于平衡二叉樹的。

但是需要注意的是,如果應(yīng)用場景中對(duì)插入、刪除不頻繁,只是對(duì)查找要求較高,那么平衡二叉樹還是較優(yōu)于紅黑樹。

總結(jié)

為什么有了數(shù)組和鏈表還要引入二叉樹?

針對(duì)數(shù)組和鏈表的優(yōu)缺點(diǎn),無法說鏈表一定優(yōu)于數(shù)組,或者是數(shù)組一定優(yōu)于鏈表,因?yàn)槟承╅L期的需要,所以就推出一個(gè)相對(duì)折中的二叉樹。

為什么有了二叉樹還要引入平衡二叉樹?

有了二叉樹還不算完,二叉樹有一種極端的情況,就是所有的子結(jié)點(diǎn)偏向一端,二叉樹退化成鏈表,這就相當(dāng)于我選擇了這種的二叉樹,你現(xiàn)在罷工不干了,找了個(gè)鏈表來糊弄我…

所以為了解決二叉查找樹退化為鏈表的情況,引入了平衡二叉樹,即:

平衡二叉樹是為了解決二叉樹退化成一棵鏈表而誕生的。

既然有了平衡二叉樹,這下總沒有問題了吧?

為什么有了平衡二叉樹還要引入紅黑樹?

但是是實(shí)際使用過程中,因?yàn)槠胶舛鏄渥非蠼^對(duì)嚴(yán)格的平衡關(guān)系,顯然這個(gè)規(guī)則在于頻繁的插入、刪除等操作的情景性能肯定會(huì)出現(xiàn)問題…

所以為了解決這個(gè)問題,進(jìn)而又引入了紅黑樹。

平衡二叉樹追求絕對(duì)嚴(yán)格的平衡,平衡條件必須滿足左右子樹高度差不超過1,紅黑樹是放棄追求完全平衡,它的旋轉(zhuǎn)次數(shù)少,插入最多兩次旋轉(zhuǎn),刪除最多三次旋轉(zhuǎn),所以對(duì)于搜索、插入、刪除操作較多的情況下,紅黑樹的效率是優(yōu)于平衡二叉樹的。

紅黑樹是終結(jié)嗎?

時(shí)代總是進(jìn)步的,大膽猜測不會(huì)是,就跟當(dāng)初從數(shù)組、鏈表到二叉樹一樣。

至此,通過這篇希望大家對(duì)整個(gè)樹結(jié)構(gòu)的出現(xiàn)有一個(gè)基礎(chǔ)的概念,目前面試中最為常問的就是紅黑樹了,當(dāng)然這得益于 HashMap,但紅黑樹還有挺多其他的知識(shí)點(diǎn)可以考察,例如紅黑樹有哪些應(yīng)用場景?紅黑樹與哈希表在不同應(yīng)該場景的選擇?紅黑樹有哪些性質(zhì)?紅黑樹各種操作(插入刪除查詢)的時(shí)間復(fù)雜度是多少?等等等等…

希望這篇文章對(duì)你有所幫助,博客園持續(xù)更新歡迎關(guān)注。

博客園:https://www.cnblogs.com/niceyoo/p/13941947.html

總結(jié)

以上是生活随笔為你收集整理的面试官:了解二叉树吗,平衡二叉树,红黑树?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。