/*
* 面试题37:序列化二叉树
* 题目:请实现两个函数,分别用来序列化和反序列化二叉树
* 思路:序列化:前序遍历二叉树存入字符串中;反序列化:根据前序遍历重建二叉树
* 根据前序遍历规则完成序列化与反序列化。
* 所谓序列化指的是遍历二叉树为字符串;
* 所谓反序列化指的是依据字符串重新构造成二叉树。
* 依据前序遍历序列来序列化二叉树,因为前序遍历序列是从根结点开始的。
* 当在遍历二叉树时碰到Null指针时,这些Null指针被序列化为一个特殊的字符“#”。
* 另外,结点之间的数值用逗号隔开。
*/
public class No37Serialize {
public static void main(String[] args) {
No37Serialize n = new No37Serialize();
TreeNode10 root = new TreeNode10(1);
TreeNode10 p2 = new TreeNode10(2);
TreeNode10 p3 = new TreeNode10(3);
TreeNode10 p4 = new TreeNode10(4);
TreeNode10 p5 = new TreeNode10(5);
TreeNode10 p6 = new TreeNode10(6);
root.left = p2;
root.right = p3;
p2.left = p4;
p3.left = p5;
p3.right = p6;
String str = n.Serialize(root);
System.out.println(str);
TreeNode10 node = n.Deserialize(str);
System.out.print("后序遍历结果是: " );
n.lastOrderTraverse(node);
}
//后续遍历输出二叉树
private void lastOrderTraverse(TreeNode10 node) {
if (node != null) {
lastOrderTraverse(node.left);
lastOrderTraverse(node.right);
System.out.print( node.val);
}
}
//序列化
String Serialize(TreeNode10 root) {
StringBuffer sb = new StringBuffer();
if (root == null) {
sb.append("#,");
return sb.toString();
}
sb.append(root.val + ",");
sb.append(Serialize(root.left));
sb.append(Serialize(root.right));
return sb.toString();
}
//反序列化
int index = -1;
TreeNode10 Deserialize(String str) {
index++;
int len = str.length();
String[] strs = str.split(",");
TreeNode10 node = null;
if (index >= len) {
return null;
}
if (!strs[index].equals("#")) {
node = new TreeNode10(Integer.valueOf(strs[index]));
node.left = Deserialize(str);
node.right =Deserialize(str);
}
return node;
}
}
面试题37:序列化二叉树
最新推荐文章于 2021-05-04 21:41:27 发布