class Codec {
public:
string serialize(TreeNode* root) {
if (!root) return "#";
return to_string(root->val) + "," + serialize(root->left) + "," + serialize(root->right);
}
TreeNode* deserialize(string data) {
deque<string> tokens;
stringstream ss(data); string tok;
while (getline(ss, tok, ',')) tokens.push_back(tok);
function<TreeNode*()> build = [&]() -> TreeNode* {
string t = tokens.front(); tokens.pop_front();
if (t == "#") return nullptr;
TreeNode* node = new TreeNode(stoi(t));
node->left = build();
node->right = build();
return node;
};
return build();
}
};
class Codec {
public String serialize(TreeNode root) {
if (root == null) return "#";
return root.val + "," + serialize(root.left) + "," + serialize(root.right);
}
public TreeNode deserialize(String data) {
Deque<String> tokens = new ArrayDeque<>(Arrays.asList(data.split(",")));
return build(tokens);
}
private TreeNode build(Deque<String> tokens) {
String t = tokens.poll();
if (t.equals("#")) return null;
TreeNode node = new TreeNode(Integer.parseInt(t));
node.left = build(tokens);
node.right = build(tokens);
return node;
}
}
class Codec:
def serialize(self, root):
if not root: return '#'
return f"{root.val},{self.serialize(root.left)},{self.serialize(root.right)}"
def deserialize(self, data):
tokens = deque(data.split(','))
def build():
t = tokens.popleft()
if t == '#': return None
node = TreeNode(int(t))
node.left = build()
node.right = build()
return node
return build()
class Codec {
serialize(root: TreeNode | null): string {
if (!root) return '#';
return `${root.val},${this.serialize(root.left)},${this.serialize(root.right)}`;
}
deserialize(data: string): TreeNode | null {
const tokens = data.split(',');
const build = (): TreeNode | null => {
const t = tokens.shift()!;
if (t === '#') return null;
const node = new TreeNode(Number(t));
node.left = build();
node.right = build();
return node;
};
return build();
}
}
class Codec {
public:
string serialize(TreeNode* root) {
vector<string> out;
vector<TreeNode*> queue = {root};
size_t head = 0;
while (head < queue.size()) {
TreeNode* node = queue[head++];
if (!node) { out.push_back("#"); continue; }
out.push_back(to_string(node->val));
queue.push_back(node->left); queue.push_back(node->right);
}
string s; for (size_t k = 0; k < out.size(); k++) { if (k) s += ","; s += out[k]; }
return s;
}
TreeNode* deserialize(string data) {
vector<string> tokens; stringstream ss(data); string tok;
while (getline(ss, tok, ',')) tokens.push_back(tok);
if (tokens[0] == "#") return nullptr;
TreeNode* root = new TreeNode(stoi(tokens[0]));
vector<TreeNode*> queue = {root};
size_t head = 0;
for (size_t i = 1; i < tokens.size(); i += 2) {
TreeNode* parent = queue[head++];
if (tokens[i] != "#") { parent->left = new TreeNode(stoi(tokens[i])); queue.push_back(parent->left); }
if (tokens[i + 1] != "#") { parent->right = new TreeNode(stoi(tokens[i + 1])); queue.push_back(parent->right); }
}
return root;
}
};
class Codec {
public String serialize(TreeNode root) {
List<String> out = new ArrayList<>();
List<TreeNode> queue = new ArrayList<>(); queue.add(root);
int head = 0;
while (head < queue.size()) {
TreeNode node = queue.get(head++);
if (node == null) { out.add("#"); continue; }
out.add(String.valueOf(node.val));
queue.add(node.left); queue.add(node.right);
}
return String.join(",", out);
}
public TreeNode deserialize(String data) {
String[] tokens = data.split(",");
if (tokens[0].equals("#")) return null;
TreeNode root = new TreeNode(Integer.parseInt(tokens[0]));
List<TreeNode> queue = new ArrayList<>(); queue.add(root);
int head = 0;
for (int i = 1; i < tokens.length; i += 2) {
TreeNode parent = queue.get(head++);
if (!tokens[i].equals("#")) { parent.left = new TreeNode(Integer.parseInt(tokens[i])); queue.add(parent.left); }
if (!tokens[i + 1].equals("#")) { parent.right = new TreeNode(Integer.parseInt(tokens[i + 1])); queue.add(parent.right); }
}
return root;
}
}
class Codec:
def serialize(self, root):
out = []
queue = [root]
head = 0
while head < len(queue):
node = queue[head]
head += 1
if not node:
out.append('#')
continue
out.append(str(node.val))
queue.append(node.left); queue.append(node.right)
return ','.join(out)
def deserialize(self, data):
tokens = data.split(',')
if tokens[0] == '#': return None
root = TreeNode(int(tokens[0]))
queue = [root]
head = 0
for i in range(1, len(tokens), 2):
parent = queue[head]
head += 1
if tokens[i] != '#':
parent.left = TreeNode(int(tokens[i])); queue.append(parent.left)
if tokens[i + 1] != '#':
parent.right = TreeNode(int(tokens[i + 1])); queue.append(parent.right)
return root
class Codec {
serialize(root: TreeNode | null): string {
const out: string[] = [];
const queue: (TreeNode | null)[] = [root];
let head = 0;
while (head < queue.length) {
const node = queue[head++];
if (!node) { out.push('#'); continue; }
out.push(String(node.val));
queue.push(node.left, node.right);
}
return out.join(',');
}
deserialize(data: string): TreeNode | null {
const tokens = data.split(',');
if (tokens[0] === '#') return null;
const root = new TreeNode(Number(tokens[0]));
const queue: TreeNode[] = [root];
let head = 0;
for (let i = 1; i < tokens.length; i += 2) {
const parent = queue[head++];
if (tokens[i] !== '#') { parent.left = new TreeNode(Number(tokens[i])); queue.push(parent.left); }
if (tokens[i + 1] !== '#') { parent.right = new TreeNode(Number(tokens[i + 1])); queue.push(parent.right); }
}
return root;
}
}
class Codec {
public:
string serialize(TreeNode* root) {
vector<string> out;
function<void(TreeNode*)> walk = [&](TreeNode* node) {
if (!node) { out.push_back("#"); return; }
out.push_back(to_string(node->val));
walk(node->left);
walk(node->right);
};
walk(root);
string s; for (size_t k = 0; k < out.size(); k++) { if (k) s += ","; s += out[k]; }
return s;
}
TreeNode* deserialize(string data) {
vector<string> tokens; stringstream ss(data); string tok;
while (getline(ss, tok, ',')) tokens.push_back(tok);
size_t i = 0;
function<TreeNode*()> build = [&]() -> TreeNode* {
string t = tokens[i++];
if (t == "#") return nullptr;
TreeNode* node = new TreeNode(stoi(t));
node->left = build();
node->right = build();
return node;
};
return build();
}
};
class Codec {
public String serialize(TreeNode root) {
List<String> out = new ArrayList<>();
walk(root, out);
return String.join(",", out);
}
private void walk(TreeNode node, List<String> out) {
if (node == null) { out.add("#"); return; }
out.add(String.valueOf(node.val));
walk(node.left, out);
walk(node.right, out);
}
public TreeNode deserialize(String data) {
String[] tokens = data.split(",");
return build(tokens, new int[]{0});
}
private TreeNode build(String[] tokens, int[] i) {
String t = tokens[i[0]++];
if (t.equals("#")) return null;
TreeNode node = new TreeNode(Integer.parseInt(t));
node.left = build(tokens, i);
node.right = build(tokens, i);
return node;
}
}
class Codec:
def serialize(self, root):
out = []
def walk(node):
if not node:
out.append('#')
return
out.append(str(node.val))
walk(node.left)
walk(node.right)
walk(root)
return ','.join(out)
def deserialize(self, data):
tokens = data.split(',')
i = 0
def build():
nonlocal i
t = tokens[i]
i += 1
if t == '#': return None
node = TreeNode(int(t))
node.left = build()
node.right = build()
return node
return build()
class Codec {
serialize(root: TreeNode | null): string {
const out: string[] = [];
const walk = (node: TreeNode | null): void => {
if (!node) { out.push('#'); return; }
out.push(String(node.val));
walk(node.left);
walk(node.right);
};
walk(root);
return out.join(',');
}
deserialize(data: string): TreeNode | null {
const tokens = data.split(',');
let i = 0;
const build = (): TreeNode | null => {
const t = tokens[i++];
if (t === '#') return null;
const node = new TreeNode(Number(t));
node.left = build();
node.right = build();
return node;
};
return build();
}
}
class Codec {
public:
string serialize(TreeNode* root) {
vector<string> out;
vector<TreeNode*> stack = {root};
while (!stack.empty()) {
TreeNode* node = stack.back(); stack.pop_back();
if (!node) { out.push_back("#"); continue; }
out.push_back(to_string(node->val));
stack.push_back(node->right); stack.push_back(node->left);
}
string s; for (size_t k = 0; k < out.size(); k++) { if (k) s += ","; s += out[k]; }
return s;
}
TreeNode* deserialize(string data) {
vector<string> tokens; stringstream ss(data); string tok;
while (getline(ss, tok, ',')) tokens.push_back(tok);
if (tokens[0] == "#") return nullptr;
TreeNode* root = new TreeNode(stoi(tokens[0]));
struct Frame { TreeNode* node; bool left; };
vector<Frame> stack = {{root, true}};
size_t i = 1;
while (!stack.empty() && i < tokens.size()) {
Frame& top = stack.back();
string t = tokens[i++];
TreeNode* child = t == "#" ? nullptr : new TreeNode(stoi(t));
if (top.left) { top.node->left = child; top.left = false; }
else { top.node->right = child; stack.pop_back(); }
if (child) stack.push_back({child, true});
}
return root;
}
};
class Codec {
public String serialize(TreeNode root) {
List<String> out = new ArrayList<>();
List<TreeNode> stack = new ArrayList<>(); stack.add(root);
while (!stack.isEmpty()) {
TreeNode node = stack.remove(stack.size() - 1);
if (node == null) { out.add("#"); continue; }
out.add(String.valueOf(node.val));
stack.add(node.right); stack.add(node.left);
}
return String.join(",", out);
}
public TreeNode deserialize(String data) {
String[] tokens = data.split(",");
if (tokens[0].equals("#")) return null;
TreeNode root = new TreeNode(Integer.parseInt(tokens[0]));
Deque<Object[]> stack = new ArrayDeque<>(); stack.push(new Object[]{root, true});
int i = 1;
while (!stack.isEmpty() && i < tokens.length) {
Object[] top = stack.peek();
String t = tokens[i++];
TreeNode child = t.equals("#") ? null : new TreeNode(Integer.parseInt(t));
TreeNode owner = (TreeNode) top[0];
if ((Boolean) top[1]) { owner.left = child; top[1] = false; }
else { owner.right = child; stack.pop(); }
if (child != null) stack.push(new Object[]{child, true});
}
return root;
}
}
class Codec:
def serialize(self, root):
out = []
stack = [root]
while stack:
node = stack.pop()
if not node:
out.append('#')
continue
out.append(str(node.val))
stack.append(node.right); stack.append(node.left)
return ','.join(out)
def deserialize(self, data):
tokens = data.split(',')
if tokens[0] == '#': return None
root = TreeNode(int(tokens[0]))
stack = [[root, True]]
i = 1
while stack and i < len(tokens):
top = stack[-1]
t = tokens[i]
i += 1
child = None if t == '#' else TreeNode(int(t))
if top[1]:
top[0].left = child
top[1] = False
else:
top[0].right = child
stack.pop()
if child: stack.append([child, True])
return root
class Codec {
serialize(root: TreeNode | null): string {
const out: string[] = [];
const stack: (TreeNode | null)[] = [root];
while (stack.length > 0) {
const node = stack.pop()!;
if (!node) { out.push('#'); continue; }
out.push(String(node.val));
stack.push(node.right, node.left);
}
return out.join(',');
}
deserialize(data: string): TreeNode | null {
const tokens = data.split(',');
if (tokens[0] === '#') return null;
const root = new TreeNode(Number(tokens[0]));
const stack: { node: TreeNode; left: boolean }[] = [{ node: root, left: true }];
let i = 1;
while (stack.length > 0 && i < tokens.length) {
const top = stack[stack.length - 1];
const t = tokens[i++];
const child = t === '#' ? null : new TreeNode(Number(t));
if (top.left) { top.node.left = child; top.left = false; }
else { top.node.right = child; stack.pop(); }
if (child) stack.push({ node: child, left: true });
}
return root;
}
}