序列化二叉樹
阿新 • • 發佈:2020-08-16
offer_61
概要:序列化二叉樹
題目描述
請實現兩個函式,分別用來序列化和反序列化二叉樹 二叉樹的序列化是指:把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中建立起來的二叉樹可以持久儲存。序列化可以基於先序、中序、後序、層序的二叉樹遍歷方式來進行修改,序列化的結果是一個字串,序列化時通過 某種符號表示空節點(#),以 ! 表示一個結點值的結束(value!)。
二叉樹的反序列化是指:根據某種遍歷順序得到的序列化字串結果str,重構二叉樹。
例如,我們可以把一個只有根節點為1的二叉樹序列化為"1,",然後通過自己的函式來解析回這個二叉樹
思路:
如果二叉樹的序列化是從根節點開始的,那麼相應的反序列化在根節點的數值讀出來的時候就可以開始了。因此,我們可以根據前序遍歷的順序來序列化二叉樹,因為前序遍歷是從根節點開始的。在遍歷二叉樹碰到nullptr指標時,這些nullptr指標序列化為一個特殊的字元(如$)。
另外,節點的數值之間要用一個特殊字元(如,)隔開。
圖片
參考
https://www.cnblogs.com/lishanlei/p/10707645.html
https://www.cnblogs.com/ygj0930/p/6611039.html
程式碼實現:
/* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { String Serialize(TreeNode root) { //序列化,就用前序遍歷,再遍歷過程中,用“,”分開每個值,然後用“$”代表null StringBuilder builder= new StringBuilder();//建立一個builder緩衝流 IndexOrder(root,builder);//前序遍歷 return builder.toString();//返回結果 } //前序遍歷 void IndexOrder(TreeNode root, StringBuilder builder){ if(root == null) builder.append("$,");//如果當前結點時空,就再builder中新增這個符號 else{//如果不是空,注意這個地方的else不能省略,是屬於這種情況,不要丟了,如果丟了的話就時空指標異常,因為會再往後面遞迴 builder.append(root.val+",");//添加當前遍歷的值,並且在後面加符號分隔 IndexOrder(root.left,builder);//向左遞迴 IndexOrder(root.right,builder);//向右遞迴 } } int index = -1; TreeNode Deserialize(String str) { String[] perVal = str.split(",");//通過約定的符號進行分割,變成陣列 TreeNode node = null;//定義一個節點 index++;//角標++ if(!perVal[index].equals("$")){//只要 當前不是空 node = new TreeNode(Integer.valueOf(perVal[index]));//當前結點就是陣列的第一個值,也是根節點,這還是走的前序遍歷 node.left = Deserialize(str);//向左遞迴 node.right = Deserialize(str);//向右遞迴 } //如果到了空,就開始回退到上一層,也就相當於換方向了 return node; } }
總結
前序遍歷來序列化,然後再用前序遍歷來反序列化。類似於負負得正
的感覺,只不過再每次的遍歷中對遍歷中的操作時不一樣的