序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
提示: 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
输入:root = [1,2,3,null,null,4,5] 输出:[1,2,3,null,null,4,5]
输入:root = []
输出:[]
输入:root = [1,2] 输出:[1,2]
题解展开目录
先序遍历、中序遍历、后序遍历进行序列化,然后同样的方式反序列化就行
将二叉树先序遍历解码为一个序列字符串s,不同的数字之间用逗号分隔,如果遇到空节点,就只在s加上一个"null,"。 如果不是空节点,就先加上当前节点的值,然后再加上逗号。
解码的时候,也是取两个逗号之间的值,如果逗号之间为空,则说明是空节点,否则new一个TreeNode出来,节点的值就是两个逗号之间的 子串的值转为int。
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Codec { public String res = ""; // Encodes a tree to a single string. public String serialize(TreeNode root) { if(root == null) return "null,"; String res = root.val + ","; res += serialize(root.left); res += serialize(root.right); return res; } // Decodes your encoded data to tree. public TreeNode deserialize(String data) { String[] values = data.split(","); Queue<String> queue = new LinkedList<String>(); for(int i = 0;i != values.length;i++) queue.offer(values[i]); return Back_Tree(queue); } public TreeNode Back_Tree(Queue<String> queue) { String value = queue.poll(); if(value.equals("null")) return null; TreeNode head = new TreeNode(Integer.valueOf(value)); head.left = Back_Tree(queue); head.right = Back_Tree(queue); return head; } } // Your Codec object will be instantiated and called as such: // Codec ser = new Codec(); // Codec deser = new Codec(); // TreeNode ans = deser.deserialize(ser.serialize(root));