数据结构 -- N叉树的序列化与反序列化

1. 二叉树的序列化与反序列化

//序列化
public String serialize(TreeNode root) {
    if(root == null) return "#";
    return root.val + "!" + serialize(root.left) + "!" + serialize(root.right);
}

    // 反序列化
public TreeNode deserialize(String data) {
     String[] str = data.split("!");
     List<String> list = new LinkedList<>(Arrays.asList(str));
     return deserialize(list);
}

public TreeNode deserialize(List<String> list){
     if(list.get(0).equals("#")){
        list.remove(0);
        return null;
     }

     int val = Integer.parseInt(list.get(0));
     TreeNode root = new TreeNode(val);
     list.remove(0);
     root.left = deserialize(list);
     root.right = deserialize(list);
     return root;
}

2. N叉树的序列化与反序列化

序列化:记录每一个节点值,别在其后记录其孩子个数,各个数值之间用逗号隔开
反序列化:把数值添加到队列中,逐个取出

class Node{
	int val;
	List<Node> children;
 
    Node(){}
    
    Node(int val, List<Node> children){
		this.val = val;
		this.children = children;
	}
}

class code{
	//序列化
	public String serialize(Node root){
		if(root == null) return "";
		List<String> list = new LinkedList<>();
		buildString(root, list);
		return String.join(",", list);
	}

	public void buildString(Node root, List<String> list){
		if(root == null) return;
		list.add(String.valueOf(root.val));   //添加节点值
		list.add(String.valueOf(root.children.size()));  //添加节点的孩子数目

		for(Node child: root.children){
			buildString(child, list);
		}
	}

	//反序列化
	public Node deserialize(String data){
		if(data.length() == 0) return null;
		String[] str = data.split(",");
		Queue<String> queue = new LinkedList<>();
		Collections.addAll(queue, str);
		return buildTree(queue);
	}
	  
	public Node buildTree(Queue<String> queue){
		Node root = new Node();
		root.val = Integer.parseInt(queue.poll());
		int size = Integer.parseInt(queue.poll());
		root.children = new ArrayList<>(size);

		for(int i = 0; i < size; i++){
			root.children.add(buildTree(queue));
		}
		return root;
	}
	
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值