欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

二叉树序列化和反序列化

程序员文章站 2022-06-05 09:14:06
...

二叉树序列化和反序列化

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

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;
      }
}
相关标签: 算法与数据结构