1. 程式人生 > >面試攻略二(資料結構專題)

面試攻略二(資料結構專題)

二叉樹簡介

  • 性質1:在非空二叉樹的i層上,至多有2^{k-1}個節點(k>=1)。

    性質2:深度為k的二叉樹最多有2^{k}-1個結點(k≥1)。(由性質1,通過等比數列求和可證)

    性質3:一棵二叉樹的葉子結點數為n0,度為2的結點數為n2,則n0 = n2 + 1。

    性質4:具有n個結點的完全二叉樹的深度為floor(log2n) + 1 。

    性質5:如果對一棵有n個結點的完全二叉樹(其深度為floor(log2n) + 1 )的結點按層序編號,則對任一結點i(1≤i≤n)有:

    (1) 如果i = 1,則結點i是二叉樹的根,無雙親;如果i > 1,則其雙親PARENT(i)是結點 floor((i)/2)。

    (2)如果2i > n,則結點i無左孩子;否則其左孩子LCHILD(i)是結點2i。

    (3)如果2i + 1 > n,則結點i無右孩子;否則其右孩子RCHILD(i)是結點2i + 1。

附:淺談資料結構-二叉樹

的遍歷規則(前序遍歷、後序遍歷、中序遍歷)

樹的遍歷順序大體分為三種:前序遍歷(先根遍歷、先序遍歷),中序遍歷(中根遍歷),後序遍歷(後根遍歷)。

 

如圖所示二叉樹:

 

 

前序遍歷:前序遍歷可以記為根左右,若二叉樹為空,則結束返回。

 

前序遍歷的規則:

(1)訪問根節點

(2)前序遍歷左子樹

(3)前序遍歷右子樹

 

這裡需要注意:在完成第2,3步的時候,也是要按照前序遍歷二叉樹的規則完成。

前序遍歷的輸出結果:ABDECF

中序遍歷:中序遍歷可以記為左根右,也就是說在二叉樹的遍歷過程中,首先要遍歷二叉樹的左子樹,接著遍歷根節點,最後遍歷右子樹。

同樣,在二叉樹為空的時候,結束返回。

 

中序遍歷的規則:

(1)中序遍歷左子樹

(2)訪問根節點

(3)中序遍歷右子樹

 

注意:在完成第1,3步的時候,要按照中序遍歷的規則來完成。

中序遍歷的輸出結果:DBEAFC

後序遍歷:後序遍歷可以記為左右根,也就是說在二叉樹的遍歷過程中,首先按照後序遍歷的規則遍歷左子樹,接著按照後序遍歷的規則遍歷右子樹,最後訪問根節點。

在二叉樹為空的時候,結束返回。

後序遍歷二叉樹的規則:

(1)後序遍歷左子樹

(2)後序遍歷右子樹

(3)訪問根節點

注意:在完成1,2步的時候,依然要按照後序遍歷的規則來完成。

後序遍歷的輸出順序:DEBFCA

二叉樹還原

構造哈弗曼樹

附:構造哈夫曼樹

紅黑樹

  1. 每個節點要麼是紅色,要麼是黑色。
  2. 根節點必須是黑色
  3. 紅色節點不能連續(也即是,紅色節點的孩子和父親都不能是紅色)。
  4. 對於每個節點,從該點至null(樹尾端)的任何路徑,都含有相同個數的黑色節點。

左旋:右子樹逆時針掉左

TreeMap_rotateLeft.png

右旋:左子樹順時針掉右

TreeMap_rotateRight.png

 

史上最清晰的紅黑樹講解(上)

史上最清晰的紅黑樹講解(下)

Dijkstra演算法簡介

詳情參考:最短路徑問題---Dijkstra演算法詳解

網路最大流圖

從源點到匯點
按順序能走的下一步都畫上(僅一步)
到過的點不再走
直到匯點構成一條可增廣路
從匯點往前推到源點就繪製出路徑
其中可增d=分段路徑中權最小值
隨後在圖中繪製出的增廣路徑每段-d
(若<=0則直接擦除)
再隨後沿著擦除前的可增廣路徑每段反向+d

就這樣一直找啊找到源點再也出不來了或者匯點再也達不到了就停止
那麼此時最短路長度就是d1+d2+…(通過實流圖也可以看出來)

附:網路流最大流的原理圖解