题目来源: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)。
本文介绍了一种基于先序遍历的深度优先搜索实现二叉树的序列化与反序列化的算法。该算法能够将二叉树转换为字符串形式并能将字符串还原成原来的二叉树结构。

783

被折叠的 条评论
为什么被折叠?



