题目地址:序列化二叉树_牛客题霸_牛客网
题目回顾:
解题思路:
首先,序列化就是将二叉树的节点值放入一个字符串中,这里可以按照前序遍历的思路来进行操作,谦虚遍历是:根左右的情况,其中根据题意我们用"#"来表示空节点,用!来表示节点与节点之间的分割。
而反序列化就是根据序列化得到的字符串将二叉树进行重建操作,这里类似于加密解密的过程。由于我们在序列化的时候采用的是前序遍历,因此在反序列化的过程中,我们也要采用前序遍历。
首先处理空树的情况,在空树时,我们返回”#“,然后调用递归函数前序递归遍历二叉树。
在前序递归函数中,如果遇到非空节点会将其添加到str中,当然也包括表示节点与节点间分割的!符。然后依次递归它的左子树和右子树。
index则表示的是序列中的下标。
进行反序列化的时候,首先处理空树的情况,也就是说如果字符串是”#“表示这是一个空树。如果不是,就调用反序列化的递归函数前序递归重建二叉树。在这个递归函数当中,如果遇到”#“表示当前节点是空节点,如果遇到数字则根据!符来进行分割操作,同时将数字加入到节点中。根据前序遍历根左右的顺序依次递归左右子树。
整体代码:
public int index = 0;
private void SerializeFunction(TreeNode root, StringBuilder str){
if(root == null){
str.append('#');
return;
}
str.append(root.val).append('!');
SerializeFunction(root.left, str);
SerializeFunction(root.right, str);
}
//序列化
public String Serialize(TreeNode root) {
if(root == null)
return "#";
StringBuilder res = new StringBuilder();
SerializeFunction(root, res);
return res.toString();
}
private TreeNode DeserializeFunction(String str){
if(str.charAt(index) == '#'){
index++;
return null;
}
int val = 0;
while(str.charAt(index) != '!' && index != str.length()){
val = val * 10 + ((str.charAt(index)) - '0');
index++;
}
TreeNode root = new TreeNode(val);
if(index == str.length())
return root;
else
index++;
root.left = DeserializeFunction(str);
root.right = DeserializeFunction(str);
return root;
}
//反序列化
public TreeNode Deserialize(String str) {
if(str == "#")
return null;
TreeNode res = DeserializeFunction(str);
return res;
}