鍊錶有根樹的表示
棧和佇列都是動態集合。棧實現了一種先進先出的策略。類似地,佇列實現了一種後進先出的策略。
作用於棧上的insert
操作稱為壓入(push
),而無參的delete
操作常稱為彈出(pop
)。可以使用乙個陣列 s [ 1 .. n ]來實現乙個至多有 n 個元素的棧。如下圖所示,陣列 s 有個屬性 s.top ,它指向最近插入的元素。
我們把作用於佇列上的insert
操作稱為入隊(enqueue
),把作用於佇列上的delete
操作稱為出隊(dequeue
)。佇列有頭和尾。當乙個元素入隊時,將排在隊尾,而出隊的元素總是隊首元素。下圖說明了用乙個陣列 q [ 1 .. n ]來實現乙個至多含 n - 1 個元素的佇列的方法。佇列具有屬性 q.head ,它指向佇列的頭,另乙個屬性為 q.tail ,它指向新元素將會被插入的地方。
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)在鍊錶中,各物件按線性順序排序。其順序由各物件中的指標決定。本節介紹的是無序的雙鏈表。雙鏈表的每乙個元素都是乙個物件,每個物件包含乙個關鍵字域和兩個指標域: next 和 prev 。對鍊錶中的某個元素 x , x.next 指向鍊錶中 x 的後繼元素,而 x.prev 則指向鍊錶中 x 的前驅元素。下面給出的是鍊錶的基本操作。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
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
,則樹為空。
可以用二叉樹很方便地表示具有任意子女數的樹。該方法的優點是對任意含 n 個結點的有根樹僅用 o ( n )空間。這種左孩子,右兄弟的表示如下圖所示。每個結點都包含乙個父親指標 p , t.root 指向樹 t 的根。每個結點 x 不再包含指向每個孩子結點的指標,而僅包含兩個指標:
x.left-child 指向結點 x 的最左孩子。
x.right-sibling 指向結點 x 緊右邊的兄弟。
如果 x 沒有孩子,則 x.left-child =nil
;如果 x 是其父結點的最右孩子,則 x.right-sibling =nil
。
讀書筆記 演算法導論
第2章演算法入門 浮於表面不如深入其中,送給自己,自己是最大的敵人,那麼就盡最大努力去克服自己,沉思,冷靜,不浮躁!勘誤 在演算法導論第9頁,扼要的扼 內容提要 1 偽 的表示方法 2 插入排序演算法分析 3 迴圈不變式 4 演算法設計之分治法 divide and conquer 5 合併排序演算...
演算法導論 讀書筆記2010 12 6
演算法就是一系列的計算步驟,用來將輸入資料轉換為輸出結果。資料結構師儲存和組織資料的一種方式,以便於對資料進行訪問和修改。插入排序演算法,對n個資料項的時間大約是c1n 2,其中c1是乙個不依賴於n的常量。亦即該演算法所需的時間大致與n 2成正比。合併排序演算法,排序n個資料項的時間大約是c2log...
《演算法導論》讀書筆記(一)
理解 輸入到輸出的計算過程稱為演算法。1.演算法描述 2.證明演算法正確性 3.分析演算法效率 兩個例子 1.插入排序 思想 從未排序的序列中取出乙個元素,將其插入到已排序序列的正確位置。實現 include include using namespace std int main for int ...