轉載請註明原文地址: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
當前遍歷元素爲 # 則表示此子樹已結束,遍歷下一元素做爲上一結點的右兒子;
即:遇數做左;遇#變向