请实现两个函数,分别用来序列化和反序列化二叉树 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。 二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。 例如,我们可以把一个只有根节点为1的二叉树序列化为"1,",然后通过自己的函数来解析回这个二叉树
前序遍历和层序遍历均可,熟悉遍历过程。
import java.util.Queue;
import java.util.LinkedList;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
String Serialize(TreeNode root) {
StringBuilder result = new StringBuilder("");
if(root != null){
//先访问根节点
result.append(String.valueOf(root.val));
//offer poll peek
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);//需要根据队列中存储的元素来作为访问下一个节点的依据。
while(!queue.isEmpty()){
//把队列元素的左右子树进行访问,然后加入到队列中。
TreeNode head = queue.poll();
if(head.left!= null || head.right!= null){
if(head.left == null)
result.append(",#");
else{
result.append("," + String.valueOf(head.left.val));
queue.offer(head.left);
}
if(head.right == null)
result.append(",#");
else{
result.append("," + String.valueOf(head.right.val));
queue.offer(head.right);
}
}else{
//该节点为叶子节点,不需要进行任何处理。
}
}
}
return result.toString();
}
TreeNode Deserialize(String str) {
TreeNode root = null;
if(!str.equals("")){
String[] list = str.split(",");
//先建立根节点
root = new TreeNode(Integer.parseInt(list[0]));
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);//把需要插入左右节点的元素放在队列中管理,一旦左右子树建立之后就从队列中移除
int index = 1;
while(!queue.isEmpty() && index < list.length){
TreeNode temp = queue.poll();
if(!list[index].equals("#")){
TreeNode newLeft = new TreeNode(Integer.parseInt(list[index]));
temp.left = newLeft;
index ++;
queue.offer(newLeft);
}else
index ++;//所有的if都应该配备else,不然真的很容易出错误
if(index < list.length && !list[index].equals("#")){
TreeNode newRight = new TreeNode(Integer.parseInt(list[index]));
temp.right = newRight;
index ++;
queue.offer(newRight);
}else
index++;//所有的if都应该配备else,不然真的很容易出错误
}
}
return root;
}
}