1、序列化
采用先根遍历的方法,必须把空节点加上
2、反序列化
序列化后的结果:"1,2,#,#,3,4,#,#,5,#,#"
那么,反序列化时,第一个字符一定是根节点,第二个字符一定是左子树的根节点了。
注意:一般情况下,如果只有前序遍历的话,并不能唯一确定一棵二叉树;
前序遍历 + 中序遍历,可以唯一确定一棵二叉树了。
为什么这道题,只用前序遍历就能唯一确定一棵二叉树呢?因为加上了空节点null
3、代码
package com.leetcode;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
public class 二叉树的序列化与反序列化_2 {
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
//序列化后的结果:"1,2,#,#,3,4,#,#,5,#,#"
public String serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
dfs1(root, sb);
return sb.toString();
}
private void dfs1(TreeNode root,StringBuilder sb) {
if(root == null){
sb.append("#,"); //空指针null代表一个#
return;
}
sb.append(root.val + ",");
dfs1(root.left, sb);
dfs1(root.right, sb);
}
/**
* 反序列化 "1,2,#,#,3,4,#,#,5,#,#" 这个字符串
* @param data
* @return
*/
public TreeNode deserialize(String data) {
String[] data_array = data.split(",");
List<String> data_list = new LinkedList<>(Arrays.asList(data_array));
return dfs2(data_list);
}
private TreeNode dfs2(List<String> data_list) {
if(data_list.get(0).equals("#")){
data_list.remove(0);
return null;
}
int val = Integer.parseInt(data_list.get(0));
data_list.remove(0);
TreeNode root = new TreeNode(val);
root.left = dfs2(data_list);
root.right = dfs2(data_list);
return root;
}
}