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

序列化就是将树输出成字符串,反序列化将字符串转成树
层次遍历实现
序列化:通过队列的入队,出队将结点连接至字符串,如果出队的结点为null,就将该结点的字符串设置为null,直至队列为空
反序列化:将字符串转成树,字符串的第一个就是根结点,将根结点入队,因为后两个字符串的值是根结点的左右子结点,如果字符串的中的后两个值不为null,分别置为结点的左右子结点,两个结点分别入队,直至字符串结束

public class TreeNode {
	int val;
	TreeNode left;
	TreeNode right;
	TreeNode(int x) { val = x; }
}
// 序列化
public String serialize(TreeNode root) {
	if(root==null){
		return "null";
	}
	// 队列
	Queue<TreeNode> queue = new LinkedList<>();
	// 字符串
	StringBuilder builder = new StringBuilder();
	// 根结点入队
	queue.add(root);
	// 队列非空
	while(!queue.isEmpty()){
		// 元素出队
		TreeNode node = queue.poll();
		// 如果该结点为null,在字符串中设置为"null"
		if(node==null){
			builder.append("null,");
			// 结点为空就不存在左右子结点,看下一个元素
			continue;
		}
		builder.append(node.val+",");
		// 左右结点入队
		queue.add(node.left);
		queue.add(node.right);
	}
	return builder.toString();
}
// 反序列化
public TreeNode deserialize(String data) {
	// 空树
	if(data=="null"){
		return null;
	}
	Queue<TreeNode> queue = new LinkedList<>();
	String []values = data.split(",");
	// 根结点
	TreeNode root = new TreeNode(Integer.parseInt(values[0]));
	queue.add(root);
	// 因为是层次遍历,如果根结点的左右子结点是下边的两个
	for(int i=1;i<values.length;i++){
		TreeNode parent = queue.poll();
		if(!"null".equals(values[i])){
			TreeNode left = new TreeNode(Integer.parseInt(values[i]));
			parent.left = left;
			queue.add(left);
		}
		if(!"null".equals(values[++i])){
			TreeNode right= new TreeNode(Integer.parseInt(values[i]));
			parent.right= right;
			queue.add(right);
		}
	}
	return root;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值