import java.util.*;
/**
* 类似é¢
* https://leetcode.com/problems/serialize-and-deserialize-bst/
*/
/**
* è¦æ³¨æçæ¯åé符ä¸è¦å éå¤äºï¼æ¯å¦1,X,,Xè¿æ ·çï¼éå¤çè¯å¨splitæ¶ä¼æç©ºä¸²
* åéå½çåééå½çï¼éå½çç妿æ 大äºå¯è½æ 溢åº
*/
public class Codec {
// è¿éçåéç¬¦æ¯æè®²ç©¶çï¼å¦ææ¢æ'.'åå¨splitçæ¶åè¦è½¬ä¹ï¼ä½æ¯','ä¸ç¨
private static final String SEP = ",";
// è¿ä¸ªå°½å¯è½çï¼èç空é´
private static final String NULL = "X";
/** éå½çç */
public String serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
if (root != null) {
sb.append(root.val).append(SEP);
sb.append(serialize(root.left)).append(SEP);
sb.append(serialize(root.right));
} else {
sb.append(NULL);
}
return sb.toString();
}
public TreeNode deserialize(String data) {
String[] texts = data.split(SEP);
Queue queue = new LinkedList(Arrays.asList(texts));
return helper(queue);
}
private TreeNode helper(Queue queue) {
if (queue.isEmpty()) {
return null;
}
String text = queue.poll();
if (text.equals(NULL)) {
return null;
}
int val = Integer.valueOf(text);
TreeNode root = new TreeNode(val);
root.left = helper(queue);
root.right = helper(queue);
return root;
}
/** ä¸é¢æ¯ééå½ççï¼ååºéå */
public String serialize2(TreeNode root) {
StringBuilder sb = new StringBuilder();
if (root == null) {
sb.append(NULL);
return sb.toString();
}
Stack stack = new Stack();
while (!stack.isEmpty() || root != null) {
if (root != null) {
sb.append(root.val);
stack.push(root);
root = root.left;
} else {
sb.append(NULL);
root = stack.pop().right;
}
sb.append(SEP);
}
return sb.toString();
}
/**
* ååºè®¿é®ä¸éææç»ç¹
* å¨è®¾ç½®nodeæ¶ï¼ä»queueä¸ååºå¼
*/
public TreeNode deserialize2(String data) {
String[] texts = data.split(SEP);
Queue queue = new LinkedList(Arrays.asList(texts));
Deque stack = new LinkedList<>();
TreeNode root = getNode(queue), node = root;
while (!stack.isEmpty() || node != null) {
if (node != null) {
stack.push(node);
node.left = getNode(queue);
node = node.left;
} else {
node = stack.pop();
node.right = getNode(queue);
node = node.right;
}
}
return root;
}
private TreeNode getNode(Queue queue) {
if (queue.isEmpty()) {
return null;
}
String text = queue.poll();
if (text.equals(NULL)) {
return null;
}
return new TreeNode(Integer.parseInt(text));
}
/**
* BFSçç
*/
public String serialize3(TreeNode root) {
Queue queue = new LinkedList();
StringBuilder sb = new StringBuilder();
if (root == null) {
sb.append(NULL);
return sb.toString();
}
queue.add(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
if (node == null) {
sb.append(NULL).append(SEP);
continue;
}
sb.append(node.val).append(SEP);
queue.add(node.left);
queue.add(node.right);
}
return sb.toString();
}
public TreeNode deserialize3(String data) {
String[] text = data.split(SEP);
Queue queue = new LinkedList(Arrays.asList(text));
Queue queue2 = new LinkedList();
TreeNode root = getNode(queue);
queue2.add(root);
while (!queue2.isEmpty()) {
TreeNode node = queue2.poll();
if (node == null) {
continue;
}
node.left = getNode(queue);
queue2.add(node.left);
node.right = getNode(queue);
queue2.add(node.right);
}
return root;
}
}