题解 | #序列化二叉树#
序列化二叉树
http://www.nowcoder.com/practice/cf7e25aa97c04cc1a68c8f040e71fb84
直接说思想了:
序列化:
直接利用层序遍历
但注意数字与数字之间需要进行划分,本题用”_“分割,否则反序列化时无法辨识多为数字
反序列化:
同样是层序遍历的思想
创建首节点并添加到队列
然后为队列弹出的元素添加结点,添加结点的同时这些结点进行入队操作
特别注意字符”串“转化成数字的情况:0-9 转化简单,但是大于一位数需要重新定义函数考虑
import java.util.*;
public class Solution {
String Serialize(TreeNode root) {
if(root==null){
return "";
}
//直接利用层序遍历
//注意数字与数字之间需要进行划分,本题用”_“分割,否则反序列化时无法辨识多为数字
Queue<TreeNode> qu = new LinkedList();
String s = "";
qu.add(root);
TreeNode temp = new TreeNode(root.val);
s = s + temp.val;
while(qu.size()!=0){
temp = qu.poll();
if(temp.left!=null){
qu.add(temp.left);
s = s +'_'+ temp.left.val;
}else{
s = s +'_'+"#";
}
if(temp.right!=null){
qu.add(temp.right);
s = s +'_'+ temp.right.val;
}else{
s = s +'_'+ "#";
}
}
return s;
}
TreeNode Deserialize(String str) {
if(str.length()==0){
return null;
}
//同样是层序遍历的思想
//为队列弹出的元素添加结点
//特别注意字符”串“转化成数字的情况
//0-9 转化简单,但是大于一位数需要重新定义函数考虑
//双指针TreeNodetemp int ba
String[] cs = str.split("_");
TreeNode temp;
int br = 0;
TreeNode proot = new TreeNode(StringToint(cs[br]));
Queue<TreeNode> qu = new LinkedList();
qu.add(proot);
while(br<cs.length&&qu.size()!=0){
//while(ba<str.length()){
//if(ba指向元素不是#),temp增加左结点;qu入队新节点;ba++
temp = qu.poll();
br++;
if(br<cs.length&&!cs[br].equals("#")){
temp.left = new TreeNode(StringToint(cs[br]));
qu.add(temp.left);
}
//if(ba指向元素不是#),temp增加右结点;qu入队新节点;ba++
br++;
if(br<cs.length&&!cs[br].equals("#")){
temp.right = new TreeNode(StringToint(cs[br]));
qu.add(temp.right);
}
//
}
return proot;
}
//字符转化成字符串
int StringToint(String s){
char[] cs = s.toCharArray();
int a = 0;
for (int i = 0; i<cs.length; i++){
a = a * 10 + (cs[i]-'0');
}
return a;
}
}