package niuke;
/*题目描述:请实现两个函数,分别用来序列化和反序列化二叉树
思路:二叉树的序列化就是按照某种顺序遍历二叉树,遇到空结点是在遍历输出序列中
加入某个特殊字符进行标识,反序列化就是按照同样的规则将一个序列还原为一颗二叉树。
这里采用前序遍历的顺序进行序列化*/
public class SortNumber {
static String str = "";
public static void main(String[] args) {
TreeNode r1 = new TreeNode(1);
TreeNode r2 = new TreeNode(2);
TreeNode r3 = new TreeNode(3);
TreeNode r4 = new TreeNode(4);
TreeNode r5 = new TreeNode(5);
r1.left = r2;
r1.right = r3;
r2.left = r4;
r2.right = r5;
String str = Serialize(r1);
System.out.println(str);
System.out.println(Deserialize(str));
}
static String Serialize(TreeNode root) {
if(root == null) {
str = str +"#,"; //遇到空,则在字符串之后加#
return str;
}
str = str+String.valueOf(root.val)+","; //先跟节点
Serialize(root.left); //再左子树
Serialize(root.right); //再右子树
return str.substring(0, str.length()-1);
}
static int count = -1; //设为全局变量这样在递归的时候不会被刷新
static TreeNode Deserialize(String str) {
count++;
String[] s1 = str.split(","); //以,把字符串进行分割
TreeNode t1 = null;
if(!s1[count].equals("#")) { //当不是空指针的时候
t1 = new TreeNode(Integer.valueOf(s1[count])); //对应值建立节点
t1.left = Deserialize(str); //对其添加左子树节点
t1.right = Deserialize(str); //对其添加右子树节点
}
return t1;
}
}