二叉树的序列化和反序列化

84 阅读1分钟

这是记录我在练习算法中的一篇文章,视频参考了左神的数据结构与算法视频,但有一些内容是看其他书籍慢慢了解的。本文也对应leetcode156

  1. 二叉树的序列化

    其实序列化过程挺简单的,无非要注意两点

  • 在序列化的过程中应该包含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);  
}
  1. 二叉树的反序列化

    与序列化相比较,反序列化就难了一些。 反序列化其实也是用递归方法解决的。递归的基本思路就是先生成头节点,在递归生成头节点的左子树和右子树。如果采用了其他的序列化方式,反序列化也要进行相应调整。 但是应注意,如果使用中序遍历序列化二叉树,则无法唯一确定一棵二叉树,因为根节点所在的位置没办法确定。

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移除的方式实现,就不再此一一赘述了。