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


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

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

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

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

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

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

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,重構二叉樹。

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

    然后按照先序遍歷的順序“根左右”的特性,遍歷nodes數組建立二叉樹:當前遍歷元素非 # 則作為一個結點插入樹中作為上一結點的左兒子;

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

                                                                                             即:遇數作左;遇#變向                                                     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM