题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
例如,我们可以把一个只有根节点为1的二叉树序列化为"1,",然后通过自己的函数来解析回这个二叉树
方法:还是在广度优先遍历基础上修改。其中字符数组和字符串数组都是数组,都可以用下标0、1、2、3...表示,区别就是一个存放的是字符串String类型,一个存放的是字符Char类型。
package test;
import java.util.LinkedList;
import java.util.Queue;
class TreeNode {
int val;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
class Solution {
String Serialize(TreeNode root) {
if(root == null) return "[]";
StringBuffer res = new StringBuffer("[");
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while(!queue.isEmpty()) {//注意这里的8个null,会使queue.size() = 8,而不是0.
TreeNode node = queue.poll();
if(node != null) {
res.append(node.val).append(",");
queue.add(node.left);
queue.add(node.right);
}
else res.append("null,");
}
res.deleteCharAt(res.length() - 1);//把逗号删了
res.append("]");
return res.toString();
}
TreeNode Deserialize(String str) {
if(str.equals("[]")) return null;
String[] vals = str.substring(1, str.length() - 1).split(",");//把两边的中括号去了,并用","分割成字符数组
TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
int i = 1;
while(!queue.isEmpty()) {
TreeNode node = queue.poll();// poll出来就是根节点了
if(!vals[i].equals("null")) {
node.left = new TreeNode(Integer.parseInt(vals[i]));
queue.add(node.left);
}
i++;
if(!vals[i].equals("null")) {
node.right = new TreeNode(Integer.parseInt(vals[i]));
queue.add(node.right);
}
i++;
}
return root;
}
}
public class Main {
public static void main(String[] args) {
TreeNode head=new TreeNode(1);//849
TreeNode second=new TreeNode(2);//850
TreeNode three=new TreeNode(3);//851
TreeNode four=new TreeNode(4);//852
TreeNode five=new TreeNode(5);//853
TreeNode six=new TreeNode(6);//854
TreeNode seven=new TreeNode(7);//855
head.right=three;
head.left=second;
second.right=five;
second.left=four;
three.right=seven;
three.left=six;
Solution p = new Solution();
String list = p.Serialize(head);
System.out.println("序列化"+list);
TreeNode head1 = p.Deserialize(list);
System.out.println("反序列化"+head1.val);
System.out.println("反序列化"+head1.left.val);
System.out.println("反序列化"+head1.right.val);
System.out.println("反序列化"+head1.left.left.val);
System.out.println("反序列化"+head1.left.right.val);
System.out.println("反序列化"+head1.right.left.val);
System.out.println("反序列化"+head1.right.right.val);
}
}