序列化,對於某一節點
/* 前序二叉樹序列化 */
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;
}
二叉樹序列化的題,就那幾個框架,枯燥至極
演算法 序列化二叉樹
請實現兩個函式,分別用來序列化和反序列化二叉樹 二叉樹的序列化是指 把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中建立起來的二叉樹可以持久儲存。序列化可以基於先序 中序 後序 層序的二叉樹遍歷方式來進行修改,序列化的結果是乙個字串,序列化時通過 某種符號表示空節點 以 表示...
序列化二叉樹和反序列化二叉樹
題目描述 請實現兩個函式,分別用來序列化和反序列化二叉樹 二叉樹的序列化是指 把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中建立起來的二叉樹可以持久儲存。序列化可以基於先序 中序 後序 層序的二叉樹遍歷方式來進行修改,序列化的結果是乙個字串,序列化時通過 某種符號表示空節點...
序列化二叉樹
問題 實現兩個函式,序列化乙個二叉樹。如果之前做過乙個題目 用一顆二叉樹的中序和前序還原二叉樹的話,最直觀的解法是用把二叉樹系列化成乙個中序序列和乙個前序序列,但是這個方法的缺陷是每個節點上的值不能相同,而且需要將整個序列都讀入之後才能序列化,如果序列到乙個流中,在從流中讀出來還原二叉樹效率將會比較...