php 資料結構常見面試題目

2022-07-09 17:24:11 字數 2360 閱讀 2783

1,二叉樹深度優先遍歷和廣度優先遍歷

深度優先遍歷:對每乙個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次。要特別注意的是,二叉樹的深度優先遍歷比較特殊,克細分為 前序遍歷,中序遍歷,後序遍歷 (小竅門:看根節點再前中後?)

前序遍歷:根節點->左節點->右子樹

中序遍歷:左子樹->根節點->右子樹

後序遍歷:左子樹->右子樹->根節點

廣度優先遍歷:又叫層次遍歷,從上往下對每一層依次訪問,在每一層中,從左往右(也可以從右往左)訪問結點,訪問完一層就進入下一層,直到沒有結點可以訪問為止。

二叉樹的深度優先遍歷的非遞迴的通用做法是採用棧,廣度優先遍歷的非遞迴的通用做法是採用佇列。

2,堆和棧的區別

(1)堆是乙個完全二叉樹,而且某個節點的值總是不大於或不小於父節點的值(有最大堆和最小堆)

棧是乙個先進後出的線性表,(在棧頂進行操作)

(2)堆的訪問是隨意的,這就如同我們在圖書館的書架上取書,雖然書的擺放是有順序的,但是我們想取任意一本時不必像棧一樣,先取出前面所有的書,書架這種機制不同於箱子,我們可以直接取出我們想要的書

(3)記憶體的申請方式不同

棧:由作業系統(編譯器)自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。

堆: 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os**,分配方式倒是類似於鍊錶。

(4)記憶體的申請效率不同

棧:棧由系統自動分配,速度較快

堆:堆是由new分配的記憶體,一般速度比較慢,而且容易產生記憶體碎片,不過用起來最方便

(5)申請大小的限制

棧:是連續記憶體 在window裡面,棧的大小是2m,如果空間過大的話,會提示overflow

堆:不是連續記憶體,堆獲得的空間比較靈活,也比較大

(6)快取方式

棧:使用的是一級快取,通常都是被呼叫的時候處於儲存空間中,呼叫完立即釋放

堆:放在二級快取中,生命週期由虛擬機器的垃圾**演算法來決定(並不是一旦成為孤兒物件就能被**)。所以呼叫這些物件的速度相對來說更低。

(關於一級記憶體,二級記憶體:

(7)**方式

棧:由於棧上的空間是自動分配自動**的,所以棧上的資料的生存週期只是在函式的執行過程中,執行後就釋放掉,不可以再訪問。

堆:堆上的資料只要程式設計師不釋放空間,就一直可以訪問到,不過缺點是一旦忘記釋放會造成記憶體洩露

3,鍊錶反轉

例如:  輸入: 1->2->3->4->5->null       輸出: 5->4->3->2->1->null

設定兩個指標 new(剛剛修改完的界定),old(沒有修改的老的節點),

把old的指標指向new,所以這個時候需要記錄old的下乙個節點,即 tmp=old->next

這時 把new=old old=tmp 開始下一輪的迴圈

偽**:

while(old!=null

)

擴充套件:要把 head->1->2->3->4->5->6

改成 head->4->3->2->1->5->6

如下**:(前面加乙個頭指標會更好處理)

ptr reverse(ptr head,int

k) head->next->next =old;

return

new;

}

鍊錶逆轉學習通過:

4,紅黑樹:

紅黑樹的特性和優勢,在神魔情況下需要變色,在神魔情況下需要旋轉

紅黑樹是基於二叉查詢樹的

二叉查詢樹的特性:

1.左子樹上所有結點的值均小於或等於它的根結點的值。

2.右子樹上所有結點的值均大於或等於它的根結點的值。

3.左、右子樹也分別為二叉排序樹。

查詢的方式正是二分查詢的思想,查詢所需的最大次數等同於二叉查詢樹的高度。

在插入節點的時候也是利用類似的方法,通過一層層比較大小,找到新節點適合插入的位置

但是插入資料的時候,二叉查詢樹的效能可能會降低(變成瘸子)

然後紅黑樹就應運而生

紅黑樹是一種自平衡的二叉查詢樹,除了符合二叉查詢樹的基本特性外,還有下面的附加特性

1.節點是紅色或黑色。

2.根節點是黑色。

3.每個葉子節點都是黑色的空節點(nil節點)。

4 每個紅色節點的兩個子節點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點)

5.從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。

紅黑樹從樣子的最長路徑不會超過最短路徑的二倍

當插入或刪除節點的時候,紅黑樹的規則有可能會被打破,這時候需要做一些調整來維持規則

調整的方法有兩種:變色和旋轉(左旋轉和右旋轉)

另外,關於資料結構和演算法的基礎文件有:

基礎文件1

php常見面試題目 程式設計篇

文接前篇 二.程式設計篇 1.寫個函式來解決多執行緒同時讀寫乙個檔案的問題。答 function swritefile filename,writecontent,openmode w esle 2.請寫乙個函式驗證電子郵件的格式是否正確 要求使用正則 答 function emailcheck s...

PHP常見面試題

1.nginx使用哪種網路協議?nginx是應用層 我覺得從下往上的話 傳輸層用的是tcp ip 應用層用的是http fastcgi負責排程程序 可能伺服器上面沒有開啟短標籤short open tag 設定為off,php.ini開啟短標籤控制引數 short open tag on 3.簡述下...

常見面試題目3

q 您在什麼情況下會用到虛方法?它與介面有什麼不同?q override與過載有什麼區別?q 值型別與引用型別有什麼區別?q 怎樣理解靜態變數?q 向伺服器傳送請求有幾種方式?q datareader與dataset有什麼區別?q 用.net做b s結構的系統,您是用幾層結構來開發,每一層之間的關係...