天天看點

算法導論讀書筆記(10)算法導論讀書筆記(10)

算法導論讀書筆記(10)

目錄

  • 棧和隊列
    • 隊列
  • 連結清單
  • 有根樹的表示
    • 二叉樹
    • 分支數無限的有根樹

棧和隊列

棧和隊列都是動态集合。棧實作了一種 先進先出 的政策。類似地,隊列實作了一種 後進先出 的政策。

作用于棧上的

INSERT

操作稱為 壓入 (

PUSH

),而無參的

DELETE

操作常稱為 彈出 (

POP

)。可以使用一個數組 S [ 1 .. n ]來實作一個至多有 n 個元素的棧。如下圖所示,數組 S 有個屬性 S.top ,它指向最近插入的元素。

算法導論讀書筆記(10)算法導論讀書筆記(10)
STACK-EMPTY(S)
1 if S.top == 0
2     return TRUE
3 else
4     return FALSE
      
PUSH(S, x)
1 S.top = S.top + 1
2 S[S.top] = x
      
POP(S)
1 if STACK-EMPTY(S)
2     error "underflow"
3 else
4     S.top = S.top - 1
5 return S[S.top + 1]
      

隊列

我們把作用于隊列上的

INSERT

操作稱為 入隊 (

ENQUEUE

),把作用于隊列上的

DELETE

操作稱為 出隊 (

DEQUEUE

)。隊列有 頭 和 尾 。當一個元素入隊時,将排在隊尾,而出隊的元素總是隊首元素。下圖說明了用一個數組 Q [ 1 .. n ]來實作一個至多含 n - 1 個元素的隊列的方法。隊列具有屬性 Q.head ,它指向隊列的頭,另一個屬性為 Q.tail ,它指向新元素将會被插入的地方。

算法導論讀書筆記(10)算法導論讀書筆記(10)
ENQUEUE(Q, x)
1 Q[Q.tail] = x
2 if Q.tail == Q.length
3     Q.tail = 1
4 else
5     Q.tail = Q.tail + 1
      
DEQUEUE(Q)
1 x = Q[Q.head]
2 if Q.head == Q.length
3     Q.head = 1
4 else
5     Q.head = Q.head + 1
6 return x
      

連結清單

在 連結清單 中,各對象按線性順序排序。其順序由各對象中的指針決定。本節介紹的是無序的雙連結清單。 雙連結清單 的每一個元素都是一個對象,每個對象包含一個關鍵字域和兩個指針域: next 和 prev 。對連結清單中的某個元素 x , x.next 指向連結清單中 x 的後繼元素,而 x.prev 則指向連結清單中 x 的前驅元素。下面給出的是連結清單的基本操作。

LIST-SEARCH(L, k)
1 x = L.head
2 while x != NIL and x.key != k
3     x = x.next
4 return x
      
LIST-INSERT(L, x)
1 x.next = L.head
2 if L.head != NIL
3     L.head.prev = x
4 L.head = x
5 x.prev = NIL
      
LIST-DELETE(L, x)
1 if x.prev != NIL
2     x.prev.next = x.next
3 else
4     L.head = x.next
5 if x.next != NIL
6     x.next.prev = x.prev
      

有根樹的表示

用連結清單表示有根樹

二叉樹

如下圖所示,用域 p , left , right 來存放指向二叉樹 T 中的父親,左兒子和右兒子的指針。如果 x.p =

NIL

,則 x 為根。如果結點 x 無左兒子,則 x.left =

NIL

,對右兒子也類似。整個樹 T 的根由屬性 T.root 指向。如果 T.root =

NIL

,則樹為空。

算法導論讀書筆記(10)算法導論讀書筆記(10)

分支數無限的有根樹

可以用二叉樹很友善地表示具有任意子女數的樹。該方法的優點是對任意含 n 個結點的有根樹僅用 O ( n )空間。這種 左孩子 , 右兄弟 的表示如下圖所示。每個結點都包含一個父親指針 p , T.root 指向樹 T 的根。每個結點 x 不再包含指向每個孩子結點的指針,而僅包含兩個指針:

  1. x.left-child 指向結點 x 的最左孩子。
  2. x.right-sibling 指向結點 x 緊右邊的兄弟。
算法導論讀書筆記(10)算法導論讀書筆記(10)

如果 x 沒有孩子,則 x.left-child =

NIL

;如果 x 是其父結點的最右孩子,則 x.right-sibling =

NIL

轉載于:https://www.cnblogs.com/sungoshawk/p/3649004.html