剑指Offer61:序列化二叉树(Java)
参考“春天花卉副校长”的牛客解答:https://www.nowcoder.com/questionTerminal/cf7e25aa97c04cc1a68c8f040e71fb84?f=discussion
思路分析:
序列化:序列化好办,遍历一遍连成一个字符串。
反序列化:不好弄,难在实现父节点与孩子节点的关系。(详见代码中的注释)
题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
Java代码:
public class Solution {
int index=0;
String Serialize(TreeNode root) {
if(root==null){
String string="#!";
return string;
}
String str=String.valueOf(root.val)+"!";//这个结点被遍历了 先序遍历
Serialize(root.left);
Serialize(root.right);
return str+Serialize(root.left)+Serialize(root.right);
}
/*
最大的困难时实现父节点与左右孩子之间的关系
把字符串用结点结束标志切割成字符串数组string,这个字符串每个元素就是二叉树结点的数值,只不过是字符串格式的
把字符串用结点结束标志切割成字符串数组string,这个字符串每个元素就是二叉树结点的数值,只不过是字符串格式的
建一个全局变量index当作数组坐标,指向当前数组所指向的字符串(即要插入的结点的数值)。
index从等于0开始,string[index]若不是“#”,则创建一个二叉树结点node,node的左孩子是刚才过程的递归的结果;
node的右孩子是node左孩子被赋值后,递归刚才过程得到的。
每次递归index都会自增一,按顺序拿到ch数组的元素。
string[index]若是“#”,返回是null的结点。
*/
TreeNode Deserialize(String str) {
String []string=str.split("!");
TreeNode node=null;
if(!string[index].equals("#")){//String之间的相等与否不能用"=="或"!=",要使用.equal()方法
node=new TreeNode(Integer.valueOf(string[index++]));
node.left=Deserialize(str);
node.right=Deserialize(str);
}
else{
index++;
}
return node;
}
}