题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
例如,我们可以把一个只有根节点为1的二叉树序列化为"1,",然后通过自己的函数来解析回这个二叉树
分析
这就相当于先遍历二叉树,转成字符串,然后再由字符串转化回原来二叉树
二叉树可以用递归与非递归
1、递归
public class Solution {
/**
*序列化:变成字符串
*/
String Serialize(TreeNode root) {
if (root == null) {
return "";
}
StringBuffer sb = new StringBuffer();
serializeHelper(root, sb);
if(sb.length() != 0)
sb.deleteCharAt(sb.length()-1);//处理最后一个逗号
return sb.toString();
}
void serializeHelper(TreeNode node, StringBuffer sb) {
if (node == null) {
sb.append("#,");
return;
}
// 处理非null元素
sb.append(node.val + ",");
// 处理左右孩子节点
serializeHelper(node.left, sb);
serializeHelper(node.right, sb);
}
/**
* 反序列化,解析字符串为二叉树
*/
TreeNode Deserialize(String str) {
if (str == null || str.length() == 0) {
return null;
}
String[] strArr = str.split(",");
return deserializeHelper(strArr);
}
private int index = -1;
TreeNode deserializeHelper(String[] strArr) {
index++;
if (!strArr[index].equals("#")) {
TreeNode node = new TreeNode(-1);
node.val = Integer.parseInt(strArr[index]);
node.left = deserializeHelper(strArr);
node.right = deserializeHelper(strArr);
return node;
}
return null;
}
}
2、非递归
import java.util.Queue;
import java.util.LinkedList;
public class Solution {
String Serialize(TreeNode root) {
if(root == null)
return "";
StringBuffer sb = new StringBuffer();
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
TreeNode cur;
while(!queue.isEmpty()){
cur = queue.poll();
if(cur != null){
queue.offer(cur.left);
queue.offer(cur.right);
sb.append(cur.val+",");
}else{
sb.append("#,");
}
}
//去掉末尾逗号
if(sb.length() != 0){
sb.deleteCharAt(sb.length()-1);
}
return sb.toString();
}
TreeNode Deserialize(String str) {
TreeNode head = null;
if(str == null || str.length() == 0) {
return head;
}
String[] nodes = str.split(",");
TreeNode[] treeNodes = new TreeNode[nodes.length];//初始化为null并未创建、分配内存
// 1、创建结点
for(int i=0; i<nodes.length; i++){
if(!nodes[i].equals("#")) {
treeNodes[i] = new TreeNode(Integer.parseInt(nodes[i]));
}
}
// 2、将结点链接形成二叉树
for(int i=0, j = 1; j < treeNodes.length; i++){
if(treeNodes[i] != null){
treeNodes[i].left = treeNodes[j++];
treeNodes[i].right = treeNodes[j++];
}
}
return treeNodes[0];
}
}