二叉樹(shù)

轉(zhuǎn)載自https://baijiahao.baidu.com/s?id=1675247850928846451&wfr=spider&for=pc

常見(jiàn)數(shù)據(jù)結(jié)構(gòu)

一、數(shù)組

數(shù)據(jù)是有限個(gè)相同類型的變量所組成的有序集合稠氮。數(shù)組中的每一個(gè)變量被稱為元素毅舆。

二宪彩、 鏈表

image

鏈表是一種在物理上非連續(xù)、非順序的數(shù)據(jù)結(jié)構(gòu)房资,由若干個(gè)節(jié)點(diǎn)組成喳资。

單向鏈表的每一個(gè)節(jié)點(diǎn)又包含兩部分袁梗,一部分是存放數(shù)據(jù)的變量data宜鸯,另一部分是指向下一個(gè)節(jié)點(diǎn)的指針next。

image
  • 鏈表 VS 數(shù)組

數(shù)組:適合多讀遮怜、插入刪除少的場(chǎng)景淋袖。

鏈表:適用于插入刪除多、讀少的場(chǎng)景

三锯梁、棧

棧是一種線性邏輯數(shù)據(jù)結(jié)構(gòu)即碗,棧的元素只能后進(jìn)先出。最早進(jìn)入的元素存放的位置叫做棧底陌凳,最后進(jìn)入的元素存放的位置叫棧頂剥懒。

一個(gè)比喻,棧是一個(gè)一端封閉一端的開(kāi)放的中空管子合敦,隊(duì)列是兩端開(kāi)放的中空管子初橘。

image

四、隊(duì)列

這一種線性邏輯數(shù)據(jù)結(jié)構(gòu),隊(duì)列的元素只能后進(jìn)后出保檐。隊(duì)列的出口端叫做隊(duì)頭耕蝉,隊(duì)列的入口端叫做隊(duì)尾。

image

五夜只、哈希表

哈希表是一種邏輯數(shù)據(jù)結(jié)構(gòu)垒在,提供了鍵(key)和值(value)的映射關(guān)系。

image

哈希表本質(zhì)上是一個(gè)數(shù)組扔亥,只是數(shù)組只能根據(jù)下標(biāo)场躯,像a[0] a[1] a[2] a[3] 這樣來(lái)訪問(wèn),而哈希表的key則是以字符串類型為主的砸王。通過(guò)哈希函數(shù)推盛,我們可以把字符串或其他類型的key,轉(zhuǎn)化成數(shù)組的下標(biāo)index谦铃。如給出一個(gè)長(zhǎng)度為8的數(shù)組耘成,則:

當(dāng)key=001121時(shí),

index = HashCode ("001121") % Array.length = 7

當(dāng)key=this時(shí)驹闰,

index = HashCode ("this") % Array.length = 6

image

六瘪菌、樹(shù)

樹(shù)(tree)是n(n≥0)個(gè)節(jié)點(diǎn)的有限集。

當(dāng)n=0時(shí)嘹朗,稱為空樹(shù)师妙。在任意一個(gè)非空樹(shù)中,有如下特點(diǎn):

有且僅有一個(gè)特定的稱為根的節(jié)點(diǎn)屹培。

當(dāng)n>1時(shí)默穴,其余節(jié)點(diǎn)可分為m(m>0)個(gè)互不相交的有限集,每一個(gè)集合本身又是一個(gè)樹(shù)褪秀,并稱為根的子樹(shù)蓄诽。

  • 樹(shù)的遍歷?

(1)深度優(yōu)先

前序:根節(jié)點(diǎn)媒吗、左子樹(shù)仑氛、右子樹(shù)。

image

中序:左子樹(shù)闸英、根節(jié)點(diǎn)锯岖、右子樹(shù)。

image

后序:左子樹(shù)甫何、右子樹(shù)出吹、根節(jié)點(diǎn)。

image

實(shí)現(xiàn)方式:遞歸或棧辙喂。

(2)廣度優(yōu)先

層序:一層一層遍歷捶牢。

image

實(shí)現(xiàn)方式:隊(duì)列赃额。

七、二叉樹(shù)

二叉樹(shù)(binary tree)是樹(shù)的一種特殊形式叫确。二叉跳芳,顧名思義,這種樹(shù)的每個(gè)節(jié)點(diǎn)最多有2個(gè)孩子節(jié)點(diǎn)竹勉。注意飞盆,這里是最多有2個(gè),也可能只有1個(gè)次乓,或者沒(méi)有孩子節(jié)點(diǎn)吓歇。

image

滿二叉樹(shù)是指一個(gè)二叉樹(shù)的所有非葉子節(jié)點(diǎn)都存在左右孩子,并且所有葉子節(jié)點(diǎn)都在同一層級(jí)上票腰,那么這個(gè)樹(shù)就是滿二叉樹(shù)城看。

完全二叉樹(shù)則是對(duì)一個(gè)有n個(gè)節(jié)點(diǎn)的二叉樹(shù),按層級(jí)順序編號(hào)杏慰,則所有節(jié)點(diǎn)的編號(hào)為從1到n测柠。如果這個(gè)樹(shù)所有節(jié)點(diǎn)和同樣深度的滿二叉樹(shù)的編號(hào)為從1到n的節(jié)點(diǎn)位置相同,則這個(gè)二叉樹(shù)為完全二叉樹(shù)缘滥。

八轰胁、二叉查找樹(shù)

二叉查找樹(shù)在二叉樹(shù)的基礎(chǔ)上增加了以下幾個(gè)條件:

如果左子樹(shù)不為空,則左子樹(shù)上所有節(jié)點(diǎn)的值均小于根節(jié)點(diǎn)的值朝扼。

如果右子樹(shù)不為空赃阀,則右子樹(shù)上所有節(jié)點(diǎn)的值均大于根節(jié)點(diǎn)的值。

左擎颖、右子樹(shù)也都是二叉查找樹(shù)榛斯。

image

九、二叉堆

二叉堆是一種特殊的完全二叉樹(shù)搂捧,它分為兩個(gè)類型:最大堆和最小堆驮俗。

最大堆的任何一個(gè)父節(jié)點(diǎn)的值,都大于或等于它左异旧、右孩子節(jié)點(diǎn)的值意述。

最小堆的任何一個(gè)父節(jié)點(diǎn)的值提佣,都小于或等于它左吮蛹、右孩子節(jié)點(diǎn)的值。

image

常見(jiàn)排序算法

image

這是十大經(jīng)典排序算法拌屏,下面將簡(jiǎn)要介紹其中的冒泡排序潮针、歸并排序、快速排序倚喂、堆排序和桶排序算法每篷,最后對(duì)十大常見(jiàn)算法做一個(gè)簡(jiǎn)單的性能對(duì)比分析瓣戚。

1 冒泡排序

冒泡排序是一種簡(jiǎn)單的排序算法。它重復(fù)地走訪過(guò)要排序的數(shù)列焦读,一次比較兩個(gè)元素子库,如果它們的順序錯(cuò)誤就把它們交換過(guò)來(lái)。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換矗晃,也就是說(shuō)該數(shù)列已經(jīng)排序完成仑嗅。這個(gè)算法的名字由來(lái)是因?yàn)樵叫〉脑貢?huì)經(jīng)由交換慢慢“浮”到數(shù)列的頂端。

image
image
  • 比較相鄰的元素张症。如果第一個(gè)比第二個(gè)大仓技,就交換它們兩個(gè)。
  • 對(duì)每一對(duì)相鄰元素作同樣的工作俗他,從開(kāi)始第一對(duì)到結(jié)尾的最后一對(duì)脖捻,這樣在最后的元素應(yīng)該會(huì)是最大的數(shù)。
  • 針對(duì)所有的元素重復(fù)以上的步驟兆衅,除了最后一個(gè)地沮。
  • 重復(fù)步驟1~3,直到排序完成羡亩。

2 歸并排序

歸并排序是建立在歸并操作上的一種有效的排序算法诉濒。該算法是采用分治法的一個(gè)非常典型的應(yīng)用。遞歸的把當(dāng)前序列分割成兩半(分割)夕春,在保持元素順序的同時(shí)將上一步得到的子序列集成到一起(歸并)未荒,最終形成一個(gè)有序數(shù)列。

image
  • 把長(zhǎng)度為n的輸入序列分成兩個(gè)長(zhǎng)度為n/2的子序列及志。
  • 對(duì)這兩個(gè)子序列分別采用歸并排序片排。
  • 將兩個(gè)排序好的子序列合并成一個(gè)最終的排序序列。

3 快速排序

快速排序使用分治法策略來(lái)把一個(gè)序列分為較小和較大的2個(gè)子序列速侈,然后遞歸地排序兩個(gè)子序列率寡,以達(dá)到整個(gè)數(shù)列最終有序。

image
image
  • 從數(shù)列中挑出一個(gè)元素倚搬,稱為 “基準(zhǔn)值”(pivot)冶共。
  • 重新排序數(shù)列,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)前面每界,所有元素比基準(zhǔn)值大的擺在基準(zhǔn)的后面(相同的數(shù)可以到任一邊)捅僵。在這個(gè)分區(qū)退出之后,該基準(zhǔn)就處于數(shù)列的中間位置眨层。這個(gè)稱為分區(qū)(partition)操作庙楚。
  • 遞歸地對(duì)【小于基準(zhǔn)值元素的子數(shù)列】和【大于基準(zhǔn)值元素的子數(shù)列】進(jìn)行排序。

4 堆排序

堆排序(Heapsort)是指利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法趴樱。堆積是一個(gè)近似完全二叉樹(shù)的結(jié)構(gòu)馒闷,并同時(shí)滿足堆積的性質(zhì):即子結(jié)點(diǎn)的鍵值或索引總是小于(或者大于)它的父節(jié)點(diǎn)酪捡。

image
  • 將初始待排序關(guān)鍵字序列(R1,R2….Rn)構(gòu)建成最大堆,此堆為初始的無(wú)序區(qū)纳账。
  • 將堆頂元素R[1]與最后一個(gè)元素R[n]交換逛薇,此時(shí)得到新的無(wú)序區(qū)(R1,R2,……Rn-1)和新的有序區(qū)(Rn),且滿足R[1,2…n-1]<=R[n]。
  • 由于交換后新的堆頂R[1]可能違反堆的性質(zhì)疏虫,因此需要對(duì)當(dāng)前無(wú)序區(qū)(R1,R2,……Rn-1)調(diào)整為新堆金刁,然后再次將R[1]與無(wú)序區(qū)最后一個(gè)元素交換,得到新的無(wú)序區(qū)(R1,R2….Rn-2)和新的有序區(qū)(Rn-1,Rn)议薪。不斷重復(fù)此過(guò)程直到有序區(qū)的元素個(gè)數(shù)為n-1尤蛮,則整個(gè)排序過(guò)程完成。

5 計(jì)數(shù)排序

計(jì)數(shù)排序不是基于比較的排序算法斯议,其核心在于將輸入的數(shù)據(jù)值轉(zhuǎn)化為鍵存儲(chǔ)在額外開(kāi)辟的數(shù)組空間中产捞。作為一種線性時(shí)間復(fù)雜度的排序,計(jì)數(shù)排序要求輸入的數(shù)據(jù)必須是有確定范圍的整數(shù)哼御。

image
  • 找出待排序的數(shù)組中最大元素坯临。
  • 構(gòu)建一個(gè)數(shù)組C,長(zhǎng)度為最大元素值+1恋昼。
  • 遍歷無(wú)序的隨機(jī)數(shù)列看靠,每一個(gè)整數(shù)按照其值對(duì)號(hào)入座,對(duì)應(yīng)數(shù)組下標(biāo)的值加1液肌。
  • 遍歷數(shù)組C挟炬,輸出數(shù)組元素的下標(biāo)值,元素的值是幾就輸出幾次嗦哆。

6 桶排序

桶排序是計(jì)數(shù)排序的升級(jí)版谤祖。它利用了函數(shù)的映射關(guān)系,高效與否的關(guān)鍵就在于這個(gè)映射函數(shù)的確定老速。實(shí)現(xiàn)原理:假設(shè)輸入數(shù)據(jù)服從均勻分布粥喜,將數(shù)據(jù)分到有限數(shù)量的桶里,每個(gè)桶再分別排序(有可能再使用別的排序算法或是以遞歸方式繼續(xù)使用桶排序進(jìn)行排序)橘券。

image
  • 創(chuàng)建桶额湘,區(qū)間跨度=(最大值-最小值)/(桶的數(shù)量-1)。
  • 遍歷數(shù)列旁舰,對(duì)號(hào)入座锋华。
  • 每個(gè)桶內(nèi)進(jìn)行排序,可選擇快排等鬓梅。
  • 遍歷所有的桶供置,輸出所有元素谨湘。

7 性能對(duì)比

隨機(jī)生成區(qū)間0 ~ K之間的序列绽快,共計(jì)N個(gè)數(shù)字芥丧,利用各種算法進(jìn)行排序,記錄排序所需時(shí)間坊罢。

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末续担,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子活孩,更是在濱河造成了極大的恐慌物遇,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件憾儒,死亡現(xiàn)場(chǎng)離奇詭異询兴,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)起趾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門诗舰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人训裆,你說(shuō)我怎么就攤上這事眶根。” “怎么了边琉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵属百,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我变姨,道長(zhǎng)族扰,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任定欧,我火速辦了婚禮别伏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘忧额。我一直安慰自己厘肮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布睦番。 她就那樣靜靜地躺著类茂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪托嚣。 梳的紋絲不亂的頭發(fā)上巩检,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音示启,去河邊找鬼兢哭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛夫嗓,可吹牛的內(nèi)容都是我干的迟螺。 我是一名探鬼主播冲秽,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼矩父!你這毒婦竟也來(lái)了锉桑?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤窍株,失蹤者是張志新(化名)和其女友劉穎民轴,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體球订,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡后裸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了冒滩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轻抱。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖旦部,靈堂內(nèi)的尸體忽然破棺而出祈搜,到底是詐尸還是另有隱情,我是刑警寧澤士八,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布容燕,位于F島的核電站,受9級(jí)特大地震影響婚度,放射性物質(zhì)發(fā)生泄漏蘸秘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一蝗茁、第九天 我趴在偏房一處隱蔽的房頂上張望醋虏。 院中可真熱鬧,春花似錦哮翘、人聲如沸颈嚼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)阻课。三九已至,卻和暖如春艰匙,著一層夾襖步出監(jiān)牢的瞬間限煞,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工员凝, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留衔憨,地道東北人油狂。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓店枣,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親瓶蚂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351