思路:
递归
我们采用前序遍历的方式构造字符串并恢复树
- 递归函数退出条件是当节点为空,则返回"#“。我们一定要用一个”#"来实现占位的操作,这样才能保证我们的树是唯一的,否则
单独前序遍历出来的字符串是无法恢复成唯一的一棵树的 - 然后我们递归地返回
当前值+","+递归左子节点+","+递归右子节点
- 我们引入了一个新的结构queue来储存字符串分割后的前序遍历结果
- 由于前序遍历,我们首先从queue中取出队首,将其对象化成为一个节点
- 然后将左子节点值设为递归这个queue的函数返回结果
- 然后将右子节点值设为递归这个queue的函数返回结果
- 这正好符合了前序遍历的规则,我们倒着又建立了这棵树
代码实现:
import java.util.LinkedList;
import java.util.Queue;
public class Solution {
String Serialize(TreeNode root) {
if (root == null) return "#";
return root.val + "," + Serialize(root.left) + "," + Serialize(root.right);
}
TreeNode Deserialize(String str) {
String[] strs = str.split(",");
Queue<String> queue = new LinkedList<>();
for (int i = 0 ; i < strs.length ; i++) {
queue.offer(strs[i]);
}
return res(queue);
}
TreeNode res(Queue<String> queue) {
String pop = queue.poll();
if (pop.equals("#")) return null;
TreeNode head = new TreeNode(Integer.valueOf(pop));
head.left = res(queue);
head.right = res(queue);
return head;
}
}
复杂度分析 时间复杂度:O(n),所有的节点都要遍历一遍 空间复杂度:O(n),队列空间装载了所有节点的规模
|