题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
解题思路
- 序列化:就是把二叉树的结构转化为字符串,存到内存中;
- 反序列化:就是把内存中的二叉树读取出来,转换为二叉树的结构;
- 序列化:
- 先序遍历(中左右)
- 如果不为空,字符串是值加上_(为了反序列化的时候拆分);如果为空,字符串是#加上_
- 反序列化:
- 将字符串根据_拆分为字符串数组,将数组中的元素添加到队列中,如果弹出来的是#,那么为空;
- 弹出来的第一个是根节点;
- 弹出来的第二个是左子树的根节点;
- 弹出来的第三个是右子树的根节点;
代码
import java.util.Queue;
import java.util.LinkedList;
public class Solution {
//1.先序遍历序列化
String Serialize(TreeNode root) {
if(root==null){
return "#_";
}
String result=root.val+"_";
result=result+Serialize(root.left);
result=result+Serialize(root.right);
return result;
}
//2.先序遍历反序列化
//2.1 拆分字符串,加到队列中
TreeNode Deserialize(String str) {
String[] res=str.split("_");
Queue<String> values=new LinkedList<String>();
for(int i=0;i<res.length;i++){
values.offer(res[i]);
}
return reconNode(values);
}
//2.2 构造二叉树的结构
TreeNode reconNode(Queue<String> queue){
String value=queue.poll();
if(value.equals("#")){
return null;
}
TreeNode head=new TreeNode(Integer.valueOf(value));
head.left=reconNode(queue);//构建左子树
head.right=reconNode(queue);//构建右子树
return head;
}
}