题目来源:https://leetcode-cn.com/problems/xu-lie-hua-er-cha-shu-lcof/
简而言之,将一个给定的TreeNode类型的二叉树序列化为字符串,并且可以将字符串重新反序列化为二叉树。
通过本题可以了解二叉树的基本结构。
- TreeNode 节点 root
- root.left 即为其左子树,root.right 即为右子树
- 可以使用 root == null 直接判定当前节点是否为空
- root.val即为节点值
以及一个有趣的地方:
String abc = "777";
String test = abc.valueOf(666); // 这里使用abc而不是类名String
// 这里会报警告,非静态对象调用静态方法。也就是说valueOf是String类的静态方法。
创建一个以字符串数组元素为链表元素的列表:
List<String> dataList = new LinkedList<String>(Arrays.asList(nodeData));
// 其中nodeData为字符串数组
相关操作:
- dataList.get(index) 获取index处元素
- dataList.remove(index) 删除index处元素,之后的元素向前补位
基于先序遍历的dfs实现:
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
return dfsSerialize(root, "");
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
String[] nodeData = data.split(",");
List<String> dataList = new LinkedList<String>(Arrays.asList(nodeData));
return dataToTree(dataList);
}
public String dfsSerialize(TreeNode root, String str) {
if (root == null) {
str += "None,";
}
else {
str += String.valueOf(root.val) + ",";
str = dfsSerialize(root.left, str);
str = dfsSerialize(root.right, str);
}
return str;
}
public TreeNode dataToTree(List<String> dataList) {
if (dataList.get(0).equals("None")) {
dataList.remove(0);
return null;
}
TreeNode node = new TreeNode(Integer.valueOf(dataList.get(0)));
dataList.remove(0);
node.left = dataToTree(dataList);
node.right = dataToTree(dataList);
return node;
}
这样时空复杂度都为O(n)。