题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
这个题折磨了我3小时,总算做出来了,唉,还是菜,通过这个问题我明白了找bug是一个多么神圣还费脑子技能,这也提醒我了如果程序运行不出来可以通过看这段程序的运行步骤来解决自己脑回路的问题,这是题外话
public class Main {
//序列化的开始
String Serialize(TreeNode root) {
StringBuffer sb= new StringBuffer(); //用StringBuffer可以在后面append
if(root==null) {
return new String();
}
xuLie(root, sb);
return sb.toString();
}
//序列化的递归程序
String xuLie(TreeNode root,StringBuffer str) {
//根
str.append(String.valueOf(root.val)+",");
//左
if(root.left!=null) {
xuLie(root.left, str);
}else {
str.append("#,");
}
//右
if(root.right!=null) {
xuLie(root.right, str);
}else {
str.append("#,");
}
return null;
}
//反序列化程序
TreeNode Deserialize(String str) {
if(str.equals("")) {
return null;
}
//以,分割成数组,就算是5,也只会分割成长度为1的数组
String []strs = str.split(",");
TreeNode t0 = new TreeNode(0);//创建新节点,但是值是随意加的,进入递归再重新赋值
TreeNode t1 = t0; //t1是二叉树的根
fanXuLie(t0, strs);
return t1;
}
int index=0; //设置成全局变量,这样可以递增索引
TreeNode fanXuLie(TreeNode root,String []str) {
if(str[index].equals("#")) {
return null;
}
root.val=Integer.parseInt(str[index]); //重新给节点赋值,赋的值是数值中的值,
index++;
if(str[index].equals("#")) { //如果为#说明本节点的左节点为空
root.left=null;
}else {
TreeNode rn = new TreeNode(0); //创建新节点,本节点的left指向它(由前序决定是left)
root.left =rn;
fanXuLie(rn,str); //去下一个递归赋值
}
index++;
if(str[index].equals("#")) {
root.right=null;
}else {
TreeNode rn = new TreeNode(0);//创建新节点,本节点的right指向它(由前序决定是right)
root.right =rn;
fanXuLie(rn,str);
}
return null;
}
public static void main(String[] args) {
//序列化
TreeNode tn1= new TreeNode(1);
TreeNode tn2= new TreeNode(2);
TreeNode tn3= new TreeNode(3);
TreeNode tn4= new TreeNode(4);
TreeNode tn5= new TreeNode(5);
TreeNode tn6= new TreeNode(6);
TreeNode tn7= new TreeNode(7);
tn1.left=tn2;
tn1.right=tn3;
tn2.left=tn4;
tn2.right=tn5;
tn3.left=tn6;
tn3.right=tn7;
String a = new Main9().Serialize(tn1);
System.out.println(a);
TreeNode t0=new Main9().Deserialize("1"
+ ",2,4,#,#,5,#,#,3,6,#,#,7,#,#,");
System.out.println(t0.val);
System.out.println(t0.left.val);
System.out.println(t0.left.left.val);
System.out.println(t0.left.right.val);
System.out.println(t0.right.val);
System.out.println(t0.right.left.val);
System.out.println(t0.right.right.val);
}
}