这是记录我在练习算法中的一篇文章,视频参考了左神的数据结构与算法视频,但有一些内容是看其他书籍慢慢了解的。本文也对应leetcode156
-
二叉树的序列化
其实序列化过程挺简单的,无非要注意两点
- 在序列化的过程中应该包含null,可以用#表示,也可以用其他表示,但是一定要加上
- 序列化过程和遍历一样,可以采用递归方式或非递归方式,但是递归还是比较容易理解的
public String serialize(TreeNode root) {
if (root==null) return null;
List<Integer> s = new ArrayList<>();
firstOrderTree(root,s);
return Arrays.toString(s.toArray());
}
public void firstOrderTree(TreeNode root,List<Integer> result){
if(root==null) {
result.add(null);
return;
}
result.add(root.val);
firstOrderTree(root.left,result);
firstOrderTree(root.right,result);
}
-
二叉树的反序列化
与序列化相比较,反序列化就难了一些。 反序列化其实也是用递归方法解决的。递归的基本思路就是先生成头节点,在递归生成头节点的左子树和右子树。如果采用了其他的序列化方式,反序列化也要进行相应调整。 但是应注意,如果使用中序遍历序列化二叉树,则无法唯一确定一棵二叉树,因为根节点所在的位置没办法确定。
public TreeNode deserialize(String data) {
if(data == null) return null;
String s = data.replace("[", "").replace("]", "");
String[] split = s.split(",");
Queue<String> queue = new LinkedList<>();
for (String str:split) {
queue.add(str);
}
return de(queue);
}
public TreeNode de(Queue<String> queue){
if (!queue.isEmpty()){
String poll = queue.poll();
if("null".equals(poll)) return null;
TreeNode treeNode = new TreeNode(Integer.valueOf(poll));
treeNode.left = de(queue);
treeNode.right =de(queue);
return treeNode;
}
return null;
}
在这里我使用了一个栈临时存储数据,也可以用list移除的方式实现,就不再此一一赘述了。