二叉树序列化和反序列化

二叉树序列化和反序列化

二叉树的序列化和反序列其实很简单。序列化可以暴力的理解为将一颗形象的树型结构压扁成链型结构,这个链型结构可以想象成一列火车,这列火车可以用队列表示,里面每节车厢存储了二叉树的各个节点值和辅助信息(方便反序列); 反序列就是将火车车厢里的东西倒出来,根据其进入车厢的顺序,将节点值和辅助信息有序的排列起来,还原成原来的二叉树。

eg:

该二叉树序列化可表示为:

具体代码实现

public class Codec {
    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
	//第一个辅助信息,他的本质就是如果一个节点没有哪个子节点(左节点或右节点),
	//这个子节点就用这个辅助信息表示,即占个坑,防止1_12和1_1_2的情况出现
	if(root == null){
		return "#_";
	}
	//如果该节点的值不为空,则用“_”连接下一个节点信息,res可以理解为火车
	String res = root.val + "_";
	//采用递归将所有节点信息装进火车
	res += serialize(root.left);
	res += serialize(root.right);
	return res;
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        if(data!=null){
	      //首先用“_”对所有字符串进行分割,得到字符串数组
	      String[] value = data.split("_");
	      if(value.length>0){
			Queue<String> list = new LinkedList<>();
			//遍历数组
			for(int i = 0;i!=value.length;i++){
			      //将数组内容压入队列中
				list.offer(value[i]);
			}
			return reconPreOrder(list);
	      }
	}
	      return null;
    }
      public TreeNode reconPreOrder(Queue<String> list){
            //从队列中弹出所有数组内容
	    String value = list.poll();
            //如果是“#”代表他的节点值为空
	    if(value.equals("#")){
		return null;
	    }
	    //将字符串转为整形,并把它建成树
	    Node head = new Node(Integer.valueOf(value));
	    head.left = reconPreOrder(list);
	    head.right = reconPreOrder(list);
	    return head;
      }
}
原文地址:https://www.cnblogs.com/leiger/p/13141951.html