序列化与反序列化二叉树
题目要求很明确:
使用!来分割值value,使用#来代替null值
根据题意:(采用的是前序遍历,中左右)
1
2 3
4 5 6 7
序列化之后的结果为:1!2!4!#!#!5!#!#!3!6!#!#!7!#!#!
序列化很简单,只需要在遇到null的时候添加#!号,遇到数值添加!即可
String Serialize(TreeNode root) {
if (root == null) return "";
return helpSerialize(root, new StringBuilder()).toString();
}
private StringBuilder helpSerialize(TreeNode root, StringBuilder s) {
if (root == null) return s;
s.append(root.val).append("!");
if (root.left != null) {
helpSerialize(root.left, s);
} else {
s.append("#!"); // 为null的话直接添加即可
}
if (root.right != null) {
helpSerialize(root.right, s);
} else {
s.append("#!");
}
return s;
} 反序列化的时候,由于采用的是先序遍历,此时如果遇到了#号,我们知道左边结束了,要开启右边,如果再次遇到#,表示当前整个部分的左边结束了要开始右子树。。依次类推。
private int index = 0; // 设置全局主要是遇到了#号的时候需要直接前进并返回null
TreeNode Deserialize(String str) {
if (str == null || str.length() == 0) return null;
String[] split = str.split("!");
return helpDeserialize(split);
}
private TreeNode helpDeserialize(String[] strings) {
if (strings[index].equals("#")) {
index++;// 数据前进
return null;
}
// 当前值作为节点已经被用
TreeNode root = new TreeNode(Integer.valueOf(strings[index]));
index++; // index++到达下一个需要反序列化的值
root.left = helpDeserialize(strings);
root.right = helpDeserialize(strings);
return root;
} Keep thinking keep coding~

京公网安备 11010502036488号