前言
仅记录学习笔记,如有错误欢迎指正。
题目
给一个二叉树root,实现二叉树的序列化的反序列化。示例
无。
解法一
前序遍历
class TreeNode {
TreeNode left,right;
int val;
TreeNode(int x){
val = x;
}
}
String NULL = "#";
String SEP = ",";
//序列化 先序
public String serialize(TreeNode root) {
StringBuilder str = new StringBuilder();
traverse(root,str);//借助辅助函数来传递str的值 有点循环的意思
return str.toString();
}
private void traverse(TreeNode root, StringBuilder str) {
if(root == null){
str.append(NULL);
return;
}
//先序代码:
str.append(root.val).append(SEP);
traverse(root.left,str);
traverse(root.right,str);
}
//反序列化
public TreeNode deserialize(String data) {
//将字符串转换为链表
LinkedList<String> nodes = new LinkedList<>();
for(String s : data.split(SEP)){
nodes.add(s);
}
return deserialize(nodes);
}
private TreeNode deserialize(LinkedList<String> nodes) {
if(nodes.isEmpty()){
return null;
}
//先序遍历位置:
String first = nodes.removeFirst();//return and remove thr first of the list
if(first.isEmpty()){
return null;
}
TreeNode root = new TreeNode(Integer.parseInt(first));
root.left = deserialize(nodes);
root.right = deserialize(nodes);
return root;
}
解法二
层级遍历 //层级遍历:
public String serialize1(TreeNode root) {
if(root == null){
return "";
}
StringBuilder str = new StringBuilder();
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);//入队
while(!q.isEmpty()){
TreeNode cur = q.poll();//出队
if(cur == null){
str.append(NULL).append(SEP);
continue;
}
str.append(root.val).append(SEP);
q.offer(root.left);
q.offer(root.right);
}
return str.toString();
}
public TreeNode deserialize1(String data) {
if(data.isEmpty()) return null;
String[] nodes = data.split(SEP);
//第一个为root
TreeNode root = new TreeNode(Integer.parseInt(nodes[0]));
//队列q 记录父节点
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
for(int i = 0 ;i <nodes.length;){
TreeNode parent = q.poll();
//左子节点的值
String left = nodes[i++];
if(left.equals(NULL)){
parent.left = new TreeNode(Integer.parseInt(left));
q.offer(parent.left);
}else {
parent.left = null;
}
//右子节点的值
String right = nodes[i++];
if(right.equals(NULL)){
parent.right = new TreeNode(Integer.parseInt(right));
q.offer(parent.right);
}else {
parent.right = null;
}
}
return root;
}