序列化和反序列化二叉樹

題目描述

請實現兩個函數,分別用來序列化和反序列化二叉樹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) {
        
  }
    TreeNode Deserialize(String str) {
       
  }
}

分析

什麼是二叉樹的序列化和反序列化

首先咱們先來了解一下什麼是二叉樹的序列化和反序列化java

二叉樹的序列化:將二叉樹保存在一個文件或者數組中,可以持久化的存儲node

二叉樹的反序列化:從文件或者數組中取出數據,重構一顆二叉樹數組

如何實現二叉樹的序列化

那麼如何實現二叉樹的序列化呢?咱們知道二叉樹有三種深度優先遍歷方式:前序遍歷、中序遍歷、後序遍歷app

那麼這三種遍歷方式均可以實現將二叉樹的序列化函數

基於前序遍歷實現二叉樹的序列化

那麼接下來咱們選擇基於前序遍從來實現二叉樹的序列化this

圖片描述

咱們用‘$’表示空節點spa

String Serialize(TreeNode root) {
        StringBuffer stringBuffer = new StringBuffer();
        SerializeSub(root, stringBuffer);
        return stringBuffer.toString();
    }


    public void SerializeSub(TreeNode root, StringBuffer stringBuffer) {
        //當遇到空節點的時候,標記爲$,再也不繼續遞歸遍歷
        if(root == null) {
            stringBuffer.append("$,");
        }else {
            //按照前序遍歷的順序,依次添加節點的val到stringbuffer(root->left->right)
            stringBuffer.append(root.val + ",");
            SerializeSub(root.left, stringBuffer);
            SerializeSub(root.right, stringBuffer);
        }
    }

實現二叉樹的反序列化

因爲咱們採用的是前序遍歷序列化,那麼一樣反序列化也採用前序遍歷反序列化code

  • 先將string按照「,」分隔符進行切割成爲數組
  • 從數組中讀取一個字符,將之轉化爲root treeNode,
  • 下一個字符遞歸轉爲left Node
  • 再下一個節點遞歸轉爲right Node
  • 若是遇到了空節點,就停下來,再也不遞歸建立節點

前序遍歷反序列化遞歸重建過程以下htm

圖片描述

int index = -1;
    TreeNode Deserialize(String str) {
        String[] arr = str.split(",");
        TreeNode node = null;
        index++;
        if(!arr[index].equals("$")) {
            node = new TreeNode(Integer.valueOf(arr[index]));
            node.left = Deserialize(str);
            node.right = Deserialize(str);

        }
        return node;

    }

參考

https://javabypatel.blogspot....

相關文章
相關標籤/搜索