層序遍歷
實現二叉樹的序列化與反序列化。
序列化二叉樹的方式有很多,最經典的就是將一顆二叉樹轉化為字串,這樣方便儲存到檔案。反序列化時只需解析這個字串,提取出每個節點的內容資訊,將二叉樹還原。二叉樹序列化有許多應用,比如 oj 平台在判斷你提交的二叉樹是否正確時,往往是將你的二叉樹序列化成字串,然後與正確答案的序列化字串進行比較。那麼如何將一顆二叉樹轉化成字串呢?字串可以認為是線性結構。以某種二叉樹遍歷的順序將二叉樹線性化,可以很容易建立節點與字元的對映關係。下面將分別實現先序遍歷和層序遍歷下的二叉樹序列化及反序列化。
按照先序遍歷的順序將二叉樹每個節點的值域轉換成字串,並新增到整個序列化字串的後面。每兩個節點之間新增 「_」 加以區分,如果節點為 null.
將字串以 「_」 進行分割,並用先序遍歷的順序依次建立新節點加入樹中。可以用乙個佇列儲存這些分割後子串,方便管理。
class
serialize
string res = head.element +
"_";
// 將節點的域值新增到序列化字串後面
res +=
serializepreorder
(head.left)
;// 遞迴遍歷左子樹
res +=
serializepreorder
(head.right)
;// 遞迴遍歷右子樹
return res;
}public
static node deserializebyprestring
(string str)
return
deserialpreorder
(nodequeue)
;// 呼叫 deserialpreorder 還原二叉樹
}private
static node deserialpreorder
(queue
nodequeue)
node thisnode =
newnode
(integer.
valueof
(node));
// 用字串的值初始化乙個節點
thisnode.left =
deserialpreorder
(nodequeue)
;// 遞迴建立左子樹
thisnode.right =
deserialpreorder
(nodequeue)
;// 遞迴建立右子樹
return thisnode;
}// 二叉樹節點類
static
class
node
private
node
(int x, node right, node left)
}public
static
void
main
(string[
] args)
}
out:按照層序遍歷的順序將二叉樹每個節點的值域轉換成字串,並新增到整個序列化字串的後面。每兩個節點之間新增 「_」 加以區分,如果節點為 null.1_2_4_null_null_5_null_null_3_null_null_
1 2 3 4 5
將字串以 「_」 進行分割,並用層序遍歷的順序依次建立新節點加入樹中。
class
serialize
// 按層序遍歷順序序列化
public
static string serializelevelorder
(node head)
queue
nodes =
newlinkedlist
<
>()
;
string rst =
"";
nodes.
offer
(head)
;// 根節點加入佇列
node node;
// 當前節點
while
(!nodes.
isempty()
)
rst +=
(node.element +
"_")
;// 當前節點非空,將節點值域轉化成字串新增到序列化字串後面
nodes.
offer
(node.left)
;// 當前節點左兒子入隊
nodes.
offer
(node.right)
;// 當前節點右兒子入隊
}return rst;
}// 通過層序序列化字串反序列化
public
static node deserializebylevelstring
(string str)
if(thisnode.right != null)
}return root;
// 返回根節點
}// 將字串轉化成 node
private
static node getnode
(string[
] serialization,
int idx)
return
newnode
(integer.
valueof
(serialization[idx]))
;// 返回轉化後的節點
}
out:1_2_3_4_5_null_null_null_null_null_null_
1 2 3 4 5
二叉樹 序列化與反序列化
序列化 serialization 在電腦科學的資料處理中,是指將資料結構或物件狀態轉換成可取用格式 例如存成檔案,存於緩衝,或經由網路中傳送 以留待後續在相同或另一台計算機環境中,能恢復原先狀態的過程。從一系列位元組提取資料結構的反向操作,是反序列化 也稱為解編組 deserialization ...
序列化 反序列化二叉樹
設計乙個演算法能夠實現序列化和反序列化一棵二叉樹 注意,不是二叉搜尋樹bst 這裡的序列化指的是將一棵二叉樹儲存到檔案中,反序列化就是從檔案中讀取二叉樹結點值重構原來的二叉樹。前一篇文章儲存二叉搜尋樹到檔案中 解決了儲存一棵二叉搜尋樹到檔案中的問題,但是由於本題目的意思是要把一棵二叉樹儲存到檔案中並...
二叉樹的序列化與反序列化
順便說一下,今天做題的時候也用到了stringstream這個類,是二叉樹的序列化和反序列化。設計乙個演算法,並編寫 來序列化和反序列化二叉樹。將樹寫入乙個檔案被稱為 序列化 讀取檔案後重建同樣的二叉樹被稱為 反序列化 如何反序列化或序列化二叉樹是沒有限制的,你只需要確保可以將二叉樹序列化為乙個字串...