1. 鏈表
1.1 五分鐘玩轉(zhuǎn)面試考點-數(shù)據(jù)結(jié)構(gòu)-單鏈表反轉(zhuǎn)(化整為零分析法)
總結(jié)下:這篇應(yīng)該是基礎(chǔ)耕姊,對鏈表的操作,其實是采用了化整為零
的思維方式缰儿,同時也熟悉了節(jié)點
這一概念锦秒。
1.2 五分鐘玩轉(zhuǎn)面試考點-數(shù)據(jù)結(jié)構(gòu)-合并鏈表(遞歸萌芽3-調(diào)用者模式)
總結(jié)下:這篇是兩個有序鏈表合并為一個有序鏈表的問題露泊,當然使用歸并算法
的思想是沒有問題的。但為什么我稱之為——調(diào)用者模式
旅择?因為我覺得遞歸
的思想惭笑,就是本身調(diào)用本身
。假設(shè)該方法返回的是一個有序鏈表生真,那么我自己使用頭插法
沉噩,將最小的元素插入到頭中就行了。調(diào)用者
不需要關(guān)注方法的實現(xiàn)柱蟀。只是方法返回結(jié)果川蒙,調(diào)用者
拿到結(jié)果之后,再進行邏輯處理或者直接返回长已。
1.3 五分鐘玩轉(zhuǎn)面試考點-數(shù)據(jù)結(jié)構(gòu)-有序隊列中刪除重復元素
總結(jié)下: (1)有序數(shù)組原地刪除重復元素:本質(zhì)上使用了插入排序
的思想畜眨,維護兩個指針:左邊數(shù)組是無序的,右邊數(shù)組取出一個和左邊數(shù)組最右元素比較痰哨,若是重復元素胶果,則取下一個元素,直至不相同的元素斤斧。然后放入無序數(shù)組中。最后選出無序數(shù)組霎烙。(2)有序鏈表的刪除(鏈表直接刪除):使用cur.next=cur.next.next
便可直接刪除cur.next
元素撬讽,cur
在刪除完重復元素之后蕊连,指針才往期前進一步。于是再次刪除重復元素游昼!關(guān)鍵是鏈表刪除重復元素的成本地呀
甘苍。(3)鏈表保留不重復的元素:重復元素全部刪除,一個不留烘豌。使用標志位载庭,只要是重復元素,那么不會加入到新鏈表中廊佩,并且還要前進一位跳過所有重復元素囚聚。注意:是改造的原鏈表,那么在鏈表最后節(jié)點标锄,要注意手動設(shè)置為null顽铸。即最后重復
條件flag=false&&cur.next==null
。
2. 二叉樹
2.1 五分鐘玩轉(zhuǎn)面試考點-數(shù)據(jù)結(jié)構(gòu)-二叉樹的遍歷(人之路徑料皇,根之輸出)
總結(jié)下:這篇講的是遍歷二叉樹谓松。基本上對樹的操作均是建立在遍歷算法之上的。為什么說人之路徑
是因為遍歷路徑總是相同的(除層次遍歷外)践剂,只是根輸出的時機不同
鬼譬。我們在處理二叉樹的問題時,本質(zhì)上就是處理的根
逊脯。而我們的結(jié)題思路优质,我覺得就可以定位在什么時候處理根合適
。
2.2 五分鐘玩轉(zhuǎn)面試考點-數(shù)據(jù)結(jié)構(gòu)-二叉樹遍歷的作用(鏡像二叉樹+二叉樹的深度)
總結(jié)下:我們學了二叉樹遍歷男窟,有什么用呢盆赤?具體遇到問題時,我們應(yīng)該選用那種遍歷方式
歉眷?這篇文章舉例2個例子:(1)鏡像二叉樹:使用隊列完成層次遍歷牺六,每一層中左右節(jié)點互換位置,當然是沒問題汗捡。上文我們說過淑际,操作二叉樹
就是操作根
,而操作根
想到了二叉樹的遍歷
扇住。那么后序遍歷
中春缕,我們第三次拿到根
,直接調(diào)換左右子樹就可以了艘蹋。前序遍歷
中锄贼,我們第一次拿到根
,若是直接調(diào)換也沒問題女阀。(2)二叉樹的深度:我們知道h(二叉樹)=max(h(左右兩子樹))+1
宅荤,那么使用后序遍歷
屑迂,求得左右子樹高度后,再輸出根
冯键。當然也可以使用層次遍歷
實現(xiàn)惹盼。
2.3 五分鐘玩轉(zhuǎn)面試考點-數(shù)據(jù)結(jié)構(gòu)-二叉搜索樹(遞歸萌芽2-調(diào)用者模式)
總結(jié)下:說真的,搜索二叉樹的基本特性左子樹<根<右子樹
惫确。一般我們處理就是查找
手报,新增節(jié)點
,刪除節(jié)點
改化。(1)查找節(jié)點:二叉搜索樹的特性:中序遍歷結(jié)果一定是有序的掩蛤。那么我們便可以使用中序遍歷
的方式進行查找。我們可以直接使用stack
所袁,進棧為第一次操作根盏档;出棧為第二次操作根。(2)新增節(jié)點:二叉搜索樹的特性:比根節(jié)點小的放左邊燥爷,否則放右邊蜈亩。為什么說是調(diào)用者模式
,是因為前翎,這個方法本身就是返回一個插入好的二叉樹稚配,調(diào)用者不關(guān)心內(nèi)部進行了什么邏輯,但是結(jié)果就是返回一個新的頭結(jié)點港华,調(diào)用者
只是關(guān)心結(jié)果
道川。(3)刪除節(jié)點,同理立宜,也是不關(guān)心過程冒萄,只關(guān)心結(jié)果。
2.4 五分鐘玩轉(zhuǎn)面試考點-數(shù)據(jù)結(jié)構(gòu)-重建二叉樹(遞歸萌芽1-調(diào)用者模式)
總結(jié)下:前序+中序
確定一個唯一的二叉樹橙数。但是我們知道規(guī)律“前序數(shù)組第一個節(jié)點是根節(jié)點尊流,中序數(shù)組根節(jié)點左邊是左子樹,右邊是右子樹灯帮⊙录迹”。調(diào)用者每調(diào)用一次這個方法钟哥,均會返回一個二叉樹迎献。調(diào)用者只需做好自己的邏輯即可。
即(1)聲明根節(jié)點腻贰。(2)重建左右子樹吁恍。(3)返回結(jié)果。
2.5 五分鐘玩轉(zhuǎn)面試考點-數(shù)據(jù)結(jié)構(gòu)-最大堆與最小堆(TOP N問題)
總結(jié)下:堆就是數(shù)組
組成的完全二叉樹,特點是根大于(小于)左右子樹践盼。采用的是擂臺賽
的思維鸦采,帶入到最(斜鑫 )大堆的生成的咕幻。
2.6 五分鐘玩轉(zhuǎn)面試考點-數(shù)據(jù)結(jié)構(gòu)-二叉樹轉(zhuǎn)化為鏈表(破壞-遍歷)
總結(jié)下:這個問題,就是在邊破壞樹結(jié)構(gòu)
的時候邊遍歷樹
顶霞,在未遍歷左右子樹的時候肄程,root
不應(yīng)該丟失對左右子樹的位置。
2.7 五分鐘玩轉(zhuǎn)面試考點-數(shù)據(jù)結(jié)構(gòu)-尋根之旅( 二叉樹的最近公共祖先选浑,調(diào)用者模式4-尾遞歸)
總結(jié)下:這次是對遞歸——調(diào)用者模式的一次總結(jié)蓝厌。調(diào)用者模式一般用于尾遞歸。若是需要對遞歸返回值進行進一步處理的話古徒,那么調(diào)用遞歸方法只會返回一個中間變量拓提。二叉樹的最近公共祖先,其實就是左右子樹的根節(jié)點隧膘。那么如何最終確定根節(jié)點呢代态?其實需要遍歷完左右子樹后,也就是使用后序遍歷疹吃。我們對最終返回的值進行處理蹦疑。
2.8 五分鐘玩轉(zhuǎn)面試考點-數(shù)據(jù)結(jié)構(gòu)-二叉樹的序列化+反序列化
總結(jié)下:(1)對二叉排序樹的序列化和反序列化。序列化可以直接使用前序遍歷萨驶。對于反序列化歉摧,我們可以找到根
,遍歷數(shù)組腔呜,直到第一個大于根
的子節(jié)點叁温。那么我們就可以分出左右子樹。使用調(diào)用者模式完成二叉樹的重建核畴。(敲黑板膝但,劃重點)需要考慮沒有右子樹的情況!即整個數(shù)組的值都小于根節(jié)點膛檀。(2)對于二叉樹的重建锰镀。采用層次遍歷進行的序列化,使用queue隊列咖刃,將元素都保存到queue中(即使為null)泳炉,反序列化的時候,借助ArrayList(為啥不用LinkedList)小胖考慮到嚎杨,要查找List里面的元素花鹅,還是使用ArrayList速度更快一下,對于一個節(jié)點枫浙,賦值完左右子樹之后刨肃,指針才移動到下一位古拴。
3. 排序算法
3.1 歸并算法——數(shù)據(jù)+鏈表歸并排序
總結(jié)下:歸并排序,是先將數(shù)列遞歸分解成一個個小數(shù)組——直至一個元素真友,然后進行有序數(shù)列的合并黄痪。數(shù)組
的歸并排序注意的下標邊界。鏈表的歸并排序盔然,要使用快慢指針
找到鏈表的中點桅打,然后將鏈表斷開,直至只有一個節(jié)點愈案。然后五分鐘玩轉(zhuǎn)面試考點-數(shù)據(jù)結(jié)構(gòu)-合并鏈表(遞歸萌芽3-調(diào)用者模式)進行有序鏈表的合并挺尾。