【层序遍历】序列化二叉树
求解代码
StringSerialize(TreeNoderoot){StringBuildersb=newStringBuilder();if(root!=null){Queue<TreeNode>queue=newLinkedList<>();queue.add(root);sb.append(root.val+",");// 先存入根节点值while(!queue.isEmpty()){root=queue.poll();// 取出队首的待处理节点// 严格先处理左孩子:有值存值+逗号,无值存# +逗号if(root.left!=null){sb.append(root.left.val+",");queue.add(root.left);}else{sb.append("#,");}// 严格后处理右孩子:有值存值+逗号,无值存# +逗号if(root.right!=null){sb.append(root.right.val+",");queue.add(root.right);}else{sb.append("#,");}}}returnsb.toString();}TreeNodeDeserialize(Stringstr){if(str.equals("")){returnnull;}String[]nodes=str.split(",");// 按分隔符拆分出所有节点内容intindex=0;TreeNoderoot=generate(nodes[index++]);// 第一个元素是根节点Queue<TreeNode>queue=newLinkedList<>();queue.add(root);while(!queue.isEmpty()){TreeNodecur=queue.poll();// 取出待分配子节点的父节点cur.left=generate(nodes[index++]);// 严格先分配左孩子cur.right=generate(nodes[index++]);// 严格后分配右孩子// 只有非空节点才有子节点,需要入队等待分配子节点if(cur.left!=null)queue.add(cur.left);if(cur.right!=null)queue.add(cur.right);}returnroot;}TreeNodegenerate(Stringval){returnval.equals("#")?null:newTreeNode(Integer.parseInt(val));}小贴士:
Integer.parseInt ()和Integer.valueOf ()
这俩都是 Java 中把「数字格式的字符串」转为整数 的核心静态方法,最核心的区别只有一个:
✅Integer.parseInt(String s)→ 返回基本数据类型int
✅Integer.valueOf(String s)→ 返回包装类对象Integer
