序列化就是将树输出成字符串,反序列化将字符串转成树
层次遍历实现
序列化:通过队列的入队,出队将结点连接至字符串,如果出队的结点为null,就将该结点的字符串设置为null,直至队列为空
反序列化:将字符串转成树,字符串的第一个就是根结点,将根结点入队,因为后两个字符串的值是根结点的左右子结点,如果字符串的中的后两个值不为null,分别置为结点的左右子结点,两个结点分别入队,直至字符串结束
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
// 序列化
public String serialize(TreeNode root) {
if(root==null){
return "null";
}
// 队列
Queue<TreeNode> queue = new LinkedList<>();
// 字符串
StringBuilder builder = new StringBuilder();
// 根结点入队
queue.add(root);
// 队列非空
while(!queue.isEmpty()){
// 元素出队
TreeNode node = queue.poll();
// 如果该结点为null,在字符串中设置为"null"
if(node==null){
builder.append("null,");
// 结点为空就不存在左右子结点,看下一个元素
continue;
}
builder.append(node.val+",");
// 左右结点入队
queue.add(node.left);
queue.add(node.right);
}
return builder.toString();
}
// 反序列化
public TreeNode deserialize(String data) {
// 空树
if(data=="null"){
return null;
}
Queue<TreeNode> queue = new LinkedList<>();
String []values = data.split(",");
// 根结点
TreeNode root = new TreeNode(Integer.parseInt(values[0]));
queue.add(root);
// 因为是层次遍历,如果根结点的左右子结点是下边的两个
for(int i=1;i<values.length;i++){
TreeNode parent = queue.poll();
if(!"null".equals(values[i])){
TreeNode left = new TreeNode(Integer.parseInt(values[i]));
parent.left = left;
queue.add(left);
}
if(!"null".equals(values[++i])){
TreeNode right= new TreeNode(Integer.parseInt(values[i]));
parent.right= right;
queue.add(right);
}
}
return root;
}
629

被折叠的 条评论
为什么被折叠?



