encode/decode Binary Tree, preorder+"X",要test,寫完還有時間問怎麼verify兩個tree一樣比較好
第一轮serialized deserialize tree秒 印度小哥
followup,n-nary tree,
每个node val变成str,怎么分割,(hash成int再存)
---
第一轮:
Serialize and Deserialize Tree
两种解法:
1)先记录preorder和inorder,相同数字的node特殊处理,再构建
2)一般操作,inorder遍历,用null
Follow up的几个小问题:
1)如果node不是数字而是任意字符串怎么办,可以抽象为如何serialize and deserialize String[].
解法1:把所有*替换成**再用“ * ”(有两个空格)作为分隔符
解法2:利用TCP的思想,在之前先记录每个字符的长度
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
buildStr(root,sb);
return sb.toString();
}
private void buildStr(TreeNode root, StringBuilder sb) {
if (root == null) {
sb.append("N,");
return;
}
sb.append(root.val + ",");
buildStr(root.left,sb);
buildStr(root.right,sb);
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
String[] strs = data.split(",");
return buildTree(strs, new int[]{0});
}
private TreeNode buildTree(String[] strs, int[] index) {
if (strs[index[0]].equals("N")) {
index[0]++;
return null;
}
TreeNode root = new TreeNode(Integer.parseInt(strs[index[0]]));
index[0]++;
root.left = buildTree(strs,index);
root.right = buildTree(strs,index);
return root;
}
}
using pre+in
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
return build(preorder,inorder,0,inorder.length - 1);
}
int index = 0;
private TreeNode build(int[] preorder, int[] inorder, int start, int end) {
if (start > end) return null;
//System.out.println(preorder[index]);
//System.out.println(preorder[index]);
int curIndex = -1;
for (int i = start; i <= end; i++) {
if (inorder[i] == preorder[index]) {
curIndex = i;
break;
}
}
TreeNode root = new TreeNode(preorder[index]);
index++;
root.left = build(preorder,inorder,start,curIndex - 1);
root.right = build(preorder,inorder,curIndex + 1,end);
return root;
}
}
using level order
public class Codec {
public String serialize(TreeNode root) {
if (root == null) return "";
StringBuilder sb = new StringBuilder();
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
while (!q.isEmpty()) {
TreeNode cur = q.poll();
if (cur == null) {
sb.append("N,");
continue;
} else {
sb.append(cur.val + ",");
}
q.offer(cur.left);
q.offer(cur.right);
}
// int i = sb.length()-1;
// while (sb.charAt(i) == 'N' || sb.charAt(i) == ',') i--;
// return sb.substring(0,i+2).toString();
return sb.toString();
}
public TreeNode deserialize(String data) {
if (data.equals("")) return null;
String[] strs = data.split(",");
Queue<String> q = new LinkedList<>(Arrays.asList(strs));
Queue<TreeNode> nodeq = new LinkedList<>();
TreeNode root = new TreeNode(Integer.parseInt(q.poll()));
nodeq.offer(root);
while (!nodeq.isEmpty()) {
TreeNode cur = nodeq.poll();
TreeNode left = null;
TreeNode right = null;
if (!q.isEmpty() && !q.peek().equals("N")) {
left= new TreeNode(Integer.parseInt(q.poll()));
nodeq.offer(left);
} else {
q.poll();
}
if (!q.isEmpty() && !q.peek().equals("N")) {
right= new TreeNode(Integer.parseInt(q.poll()));
nodeq.offer(right);
} else {
q.poll();
}
cur.left = left;
cur.right = right;
}
return root;
}
}
n-array record # of children
class Codec {
public String serialize(Node root) {
if (root == null) return "";
StringBuilder str = new StringBuilder();
buildStr(root, str);
return str.toString();
}
public void buildStr(Node root, StringBuilder str) {
str.append(root.val+","+ root.children.size()+",");
for (Node child: root.children) {
buildStr(child, str);
}
}
// Decodes your encoded data to tree.
public Node deserialize(String data) {
if (data == "") return null;
String[] strs = data.split(",");
Queue<String> queue = new LinkedList<>(Arrays.asList(strs));
return buildTree(queue);
}
public Node buildTree(Queue<String> queue) {
int cur = Integer.parseInt(queue.poll());
int childrenNum = Integer.parseInt(queue.poll());
List<Node> children = new ArrayList<>();
Node node = new Node(cur, children);
for (int i = 0; i < childrenNum; i++) {
children.add(buildTree(queue));
}
return node;
}
}
n-array use 1,[3,[5,6],2,4,]
class Codec {
public String serialize(Node root) {
if (root == null) return "";
StringBuilder str = new StringBuilder();
buildStr(root, str);
return str.toString();
}
public void buildStr(Node root, StringBuilder str) {
str.append(root.val+",[,");
for (Node child: root.children) {
buildStr(child, str);
}
str.append("],");
}
// Decodes your encoded data to tree.
public Node deserialize(String data) {
if (data == "") return null;
String[] strs = data.split(",");
Queue<String> queue = new LinkedList<>(Arrays.asList(strs));
return buildTree(queue);
}
public Node buildTree(Queue<String> queue) {
Node root = new Node(Integer.parseInt(queue.poll()),new ArrayList<>());
Deque<Node> stack = new ArrayDeque<>();
Node cur = root;
while (!queue.isEmpty()) {
if (queue.peek().equals("[")) {
stack.push(cur);
queue.poll();
} else if (queue.peek().equals("]")) {
stack.pop();
queue.poll();
} else {
cur = new Node(Integer.parseInt(queue.poll()),new ArrayList<>());
stack.peek().children.add(cur);
}
}
return root;
}
}