演算法小抄學習筆記 3 二叉樹序列化與反序列化

2021-10-14 01:52:04 字數 3401 閱讀 3089

序列化,對於某一節點

/* 前序二叉樹序列化 */

private string preserialize

(treenode root)

/* 輔助函式,將二叉樹存入stringbuilder */

private

void

preserialize

(treenode root, stringbuilder sb)

/* ---- 先序遍歷** ---- */

sb.(root.val).(

",")

;/* ------------------- */

preserialize

(root.left, sb)

;preserialize

(root.right, sb)

;}

反序列化,先將字串轉換為nodes陣列,利用陣列中第乙個元素為根節點這個性質,反序列化,建立二叉樹。

/* 前序二叉樹反序列化 */

private treenode predeserialize

(string data)

return

predeserialize

(nodes);}

private treenode predeserialize

(deque

nodes)

/* ---- 先序遍歷** ---- */

string node = nodes.

removefirst()

;if(node.

equals

("#"))

treenode root =

newtreenode

(integer.

parseint

(node));

/* -------------------- */

root.left =

predeserialize

(nodes)

; root.right =

predeserialize

(nodes)

;return root;

}

序列化,其實與先序遍歷思路一致,只是處理**換了乙個位置。

/* 中序遍歷序列化 */

private string inserialize

(treenode root)

/* 輔助函式,將二叉樹root序列化為stringbuilder */

private

void

inserialize

(treenode root, stringbuilder sb)

inserialize

(root.left, sb)

;/* ---- 中序遍歷** ---- */

sb.(root.val).(

",")

;/* ------------------- */

inserialize

(root.right, sb)

;}

反序列化,由於從中序遍歷陣列中無法知道根節點的位置,所以無法進行反序列化。

序列化,與先序遍歷思路基本一致。

/* 後序遍歷序列化 */

private string postserialize

(treenode root)

/* 輔助函式,將二叉樹root後序序列化為stringbuilder */

private

void

postserialize

(treenode root, stringbuilder sb)

postserialize

(root.left, sb)

;postserialize

(root.right, sb)

;/* ---- 後序遍歷** ---- */

sb.(root.val).(

",")

;/* ------------------- */

}

反序列化,這裡要注意,後序遍歷陣列中最後乙個節點才是根節點,所以處理時應該先生成右子樹,再生成左子樹。

/* 後序遍歷反序列化 */

private treenode postdeserialize

(string data)

return

postdeserialize

(nodes);}

/* 輔助函式,將linkedlist後序反序列化為treenode */

private treenode postdeserialize

(linkedlist

nodes)

string node = nodes.

removelast()

;if(node.

equals

("#"))

treenode root =

newtreenode

(integer.

parseint

(node));

// 先構造右子樹,再構造左子樹

root.right =

postdeserialize

(nodes)

; root.left =

postdeserialize

(nodes)

;return root;

}

序列化,像bfs那樣,使用乙個結點佇列,在while中依次出隊

/* 層次遍歷序列化 */

private string hierserialize

(treenode root)

sb.(cur.val).(

",")

; q.

offer

(cur.left)

; q.

offer

(cur.right);}

return sb.

tostring()

;}

反序列化,使用層次遍歷反向建立二叉樹。

/* 層次遍歷反序列化 */

private treenode hierdeserialize

(string data)

else

// 父節點右側的節點

string right = nodes[i++];

if(!right.

equals

("#"))

else

}return root;

}

二叉樹序列化的題,就那幾個框架,枯燥至極

演算法 序列化二叉樹

請實現兩個函式,分別用來序列化和反序列化二叉樹 二叉樹的序列化是指 把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中建立起來的二叉樹可以持久儲存。序列化可以基於先序 中序 後序 層序的二叉樹遍歷方式來進行修改,序列化的結果是乙個字串,序列化時通過 某種符號表示空節點 以 表示...

序列化二叉樹和反序列化二叉樹

題目描述 請實現兩個函式,分別用來序列化和反序列化二叉樹 二叉樹的序列化是指 把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中建立起來的二叉樹可以持久儲存。序列化可以基於先序 中序 後序 層序的二叉樹遍歷方式來進行修改,序列化的結果是乙個字串,序列化時通過 某種符號表示空節點...

序列化二叉樹

問題 實現兩個函式,序列化乙個二叉樹。如果之前做過乙個題目 用一顆二叉樹的中序和前序還原二叉樹的話,最直觀的解法是用把二叉樹系列化成乙個中序序列和乙個前序序列,但是這個方法的缺陷是每個節點上的值不能相同,而且需要將整個序列都讀入之後才能序列化,如果序列到乙個流中,在從流中讀出來還原二叉樹效率將會比較...