您的位置:首页 > 其它

LintCode——7. 二叉树的序列化和反序列化

2018-01-28 15:25 330 查看


描述:


设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。


如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉树序列化为一个字符串,并且可以将字符串反序列化为原来的树结构。

样例:

给出一个测试数据样例, 二叉树
{3,9,20,#,#,15,7}
,表示如下的树结构:
3
/ \
9 20
/ \
15 7
我们的数据是进行BFS遍历得到的。当你测试结果wrong answer时,你可以作为输入调试你的代码。

你可以采用其他的方法进行序列化和反序列化。



可以参考二叉树的层次遍历:二叉树的遍历——递归、非递归及层序遍历

实现代码如下:
package lintcode;

import ds.TreeNode;

import java.util.ArrayDeque;
import java.util.Deque;

/**
* Class Name  : SerializeBT_7
* Describe    : empty
* Create User : yoo
* Create Date : 2018/1/27
* Create Time : 19:05
**/

public class SerializeBT_7 {

public static String serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
if (root == null)
return null;
Deque<TreeNode> nodeDeque = new ArrayDeque<TreeNode>();
nodeDeque.add(root);
sb.append(root.val);
while (!nodeDeque.isEmpty()) {
TreeNode p = nodeDeque.pop();
if (p.left != null) {
nodeDeque.add(p.left);
sb.append("," + p.left.val);
} else {
sb.append(",#");
}
if (p.right != null) {
nodeDeque.add(p.right);
sb.append("," + p.right.val);
} else {
sb.append(",#");
}
}

String results = sb.toString();
while (results.endsWith(",#,#"))
results = results.substring(0, results.length() - 4);

return "{" + results + "}";
}

public static TreeNode deserialize(String data) {
if (data == null || data.trim().length() < 2)
return null;
data = data.substring(1, data.length() - 1);

String[] datas = data.split(",");
Deque<TreeNode> nodeDeque = new ArrayDeque<TreeNode>();
TreeNode root = new TreeNode(Integer.valueOf(datas[0]));
nodeDeque.add(root);
int i = 1;
while (i < datas.length) {
TreeNode node = nodeDeque.pop();
if (!datas[i].equals("#")) {
node.left = new TreeNode(Integer.valueOf(datas[i]));
nodeDeque.add(node.left);
} else {
node.left = null;
}
i++;
if (!(i < datas.length))
break;
if (!datas[i].equals("#")) {
node.right = new TreeNode(Integer.valueOf(datas[i]));
nodeDeque.add(node.right);
} else {
node.right = null;
}
i++;
}
return root;
}
}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: