天天看點

劍指offer——序列化二叉樹劍指offer——序列化二叉樹

劍指offer——序列化二叉樹

1、序列化知識點

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

二叉樹的序列化是指:把一棵二叉樹按照某種周遊方式的結果以某種格式儲存為字元串,進而使得記憶體中建立起來的二叉樹可以持久儲存。

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

這裡以先序周遊的方式進行序列化舉例:

先序序列化二叉樹==定義一個stringbuilder儲存序列過程中的結果:按照先序周遊方式周遊二叉樹,若結點非空則把 “結點值,” append到builder中;若結點空則把 “#,” append到builder中;最後用builder生成字元串就是序列化結果。

二:二叉樹的反序列化

二叉樹的反序列化是指:根據某種周遊順序得到的序列化字元串結果str,重構二叉樹。

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

然後按照先序周遊的順序“根左右”的特性,周遊nodes數組建立二叉樹:目前周遊元素非 # 則作為一個結點插入樹中作為上一結點的左兒子;目前周遊元素為 # 則表示此子樹已結束,周遊下一進制素作為上一結點的右兒子;

即:遇數作左;遇#變向

2、題目描述

請實作兩個函數,分别用來序列化和反序列化二叉樹

3、我的解答

利用前序周遊,遞歸,解答!

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    int index=-;
    String Serialize(TreeNode root) {
        StringBuilder sb=new StringBuilder();
        if(root==null){//遞歸出口,若為空節點,則輸入“#,”并傳回
            sb.append("#,");
            return sb.toString();
        }
        sb.append(root.val+",");//若為非空節點,則輸入“值,”
        sb.append(Serialize(root.left));//遞歸序列化左子樹
        sb.append(Serialize(root.right));//遞歸序列化右子樹 
        return sb.toString();
  }
    TreeNode Deserialize(String str) {
        index++;
        int len=str.length();
        if(index>=len){
            return null;
        }
        String[] str1=str.split(",");//分割字元串
        TreeNode node=null;
        if(!str1[index].equals("#")){//重構二叉樹
            node=new TreeNode(Integer.valueOf(str1[index]));
            node.left=Deserialize(str);
            node.right=Deserialize(str);
        }
        return node;
    }
}
           

參考知識點:

Java知識點積累——equals與”==”的比較分析

繼續閱讀