题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
例如,我们可以把一个只有根节点为1的二叉树序列化为"1,",然后通过自己的函数来解析回这个二叉树
方法:还是在广度优先遍历基础上修改。
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()) {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();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);//849TreeNode second=new TreeNode(2);//850TreeNode three=new TreeNode(3);//851TreeNode four=new TreeNode(4);//852TreeNode five=new TreeNode(5);//853TreeNode six=new TreeNode(6);//854TreeNode seven=new TreeNode(7);//855head.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);}
}