直接说思想了:
序列化:
直接利用层序遍历
但注意数字与数字之间需要进行划分,本题用”_“分割,否则反序列化时无法辨识多为数字
反序列化:
同样是层序遍历的思想
创建首节点并添加到队列
然后为队列弹出的元素添加结点,添加结点的同时这些结点进行入队操作
特别注意字符”串“转化成数字的情况: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; } }