首先明确遍历的方式,先序,中序,后序遍历可能对应着多种二叉树,导致序列化后不可逆,通常还是使用层序遍历。
还有就是明确这道题力扣给的测试用例所代表的树到底是什么,例如[5,2,3,null,null,2,4,3,1,null,null,null,null,null,null],需要注意第8,9个元素3,1是第6个元素2的子节点,而不是第4个元素null的子节点,即不是按照满二叉树的标准来生成序列的,因此不能直接使用满二叉树的父节点与子节点的下标关系来做这道题。
层序遍历
- 注意,字符串的操作如果可以使用StringBuilder就尽量使用StringBuilder,会节省很多很多时间
- 新建队列也可以使用Queue queue = new LinkedList<>();
简单说说LinkedList和Queue的区别:
LinkedList实现了Queue接口。Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果是Queue时,就完全只能访问Queue接口所定义的方法 了,而不能直接访问 LinkedList的非Queue的方法),以使得只有恰当的方法才可以使用。
因此,其实用Queue会更规范。
public String serialize(TreeNode root) {
//注意判断根节点是否为空,为空的话直接返回
if(root==null) return "";
StringBuilder s=new StringBuilder("");
//新建一个队列,将根节点入队
LinkedList<TreeNode> q=new LinkedList<>();
q.add(root);
//while循环,判断条件是队列是否为空
while(!q.isEmpty()){
TreeNode node=q.poll();
if(node==null){
//节点为空则打印null
s.append("null ");