小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
题目
请实现两个函数,分别用来序列化和反序列化二叉树。
你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构
来源:力扣(LeetCode)
思路
1.序列化时出现null的地方用","来表示
2.反序列化时同样把","解析成null。
3.记得反序列化时解析完一个元素要移除(null也要)
代码
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
String str = "";
if (root == null) {
str += "None,";
} else {
str = root.val + ",";
str += serialize(root.left);
str += serialize(root.right);
}
return str;
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
String[] strs = data.split(",");
List<String> dataList = new ArrayList<>(Arrays.asList(strs));
return process(dataList);
}
public TreeNode process(List<String> dataList) {
if (dataList.get(0).equals("None")) {
dataList.remove(0);
return null;
}
TreeNode curNode = new TreeNode(Integer.parseInt(dataList.get(0)));
dataList.remove(0);
curNode.left = process(dataList);
curNode.right = process(dataList);
return curNode;
}
}
这个地方有个坑
主要原因是:
List<String> list = new LinkedList<>(Arrays.asList(strs));
应该改为:
List<String> dataList = new ArrayList<>(Arrays.asList(strs));
来看下Arrays的源码
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
/**
* @serial include
*/
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
}
可以看到这个ArrayList类并不是我们熟悉的ArrayList,而是Arrays新建的一个内部类,继承自AbstractList类,再来看看AbstractList类中的源码
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
/**
* {@inheritDoc}
*
* <p>This implementation always throws an
* {@code UnsupportedOperationException}.
*
* @throws UnsupportedOperationException {@inheritDoc}
* @throws IndexOutOfBoundsException {@inheritDoc}
*/
public E remove(int index) {
throw new UnsupportedOperationException();
}
可以看到add和remove操作是会抛出UnsupportedOperationException异常的,所以对于Arrays.asList出来的List不能对它进行add和remove操作