1. 程式人生 > 實用技巧 >序列化二叉樹

序列化二叉樹

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;
        
  }
}

總結

前序遍歷來序列化,然後再用前序遍歷來反序列化。類似於負負得正的感覺,只不過再每次的遍歷中對遍歷中的操作時不一樣的