二叉樹基礎之序列化和反序列化二叉樹

轉載請註明原文地址:http://www.cnblogs.com/ygj0930/p/6611039.html html

    一:二叉樹序列化(持久化)node

    二叉樹的序列化是指:把一棵二叉樹按照某種遍歷方式的結果以某種格式保存爲字符串,從而使得內存中創建起來的二叉樹能夠持久保存。數組

    序列化能夠基於 先序、中序、後序、按層 的二叉樹遍歷方式來進行修改。原理都是同樣的(即遍歷順序不一樣而已,對每一個結點的處理都是同樣的),序列化的結果是一個字符串,序列化時經過  某種符號表示空節點(#),以 ! 表示一個結點值的結束(value!)。app

    這裏以先序遍歷的方式進行序列化舉例:ui

    先序序列化二叉樹==定義一個stringbuilder保存序列過程當中的結果:按照先序遍歷方式遍歷二叉樹,若結點非空則把 "結點值!" append到builder中;若結點空則把  "#!" append到builder中;最後用builder生成字符串就是序列化結果。    spa

public class TreeToString {
    public String toString(TreeNode root) {
        StringBuilder builder=new StringBuilder();
        pre(root,builder);
        return builder.toString();
    }
    public void pre(TreeNode root,StringBuilder builder){
        if(root==null){
            builder.append("#!");
        }else{
            builder.append(root.val+"!");
        //注意遞歸邊界:若是當前結點不是null則遞歸左右兒子;若是不判斷當前結點是否爲空,則在遞歸到null時出現空指針異常
            pre(root.left,builder);
            pre(root.right,builder);
        }
    }
}

                          

    二:二叉樹的反序列化指針

    二叉樹的反序列化是指:根據某種遍歷順序獲得的序列化字符串結果str,重構二叉樹。code

    先序序列化結果重構二叉樹==String[] nodes=str.split("!");//由每一個結點的結束符號劃分序列化結果序列,獲得各個結點值;htm

    而後按照先序遍歷的順序「根左右」的特性,遍歷nodes數組創建二叉樹:當前遍歷元素非 # 則做爲一個結點插入樹中做爲上一結點的左兒子;blog

                                                                                             當前遍歷元素爲 # 則表示此子樹已結束,遍歷下一元素做爲上一結點的右兒子;

                                                                                             即:遇數做左;遇#變向                                                     

相關文章
相關標籤/搜索