📖 Scenario: You are working on a system that needs to save and load binary trees efficiently. To do this, you will convert the tree into a string format (serialize) and then rebuild the tree from that string (deserialize).
🎯 Goal: Build two functions: one to serialize a binary tree into a string, and another to deserialize that string back into the original binary tree structure.
📋 What You'll Learn
Create a binary tree node structure with integer values
Write a serialize function that converts the tree into a string using preorder traversal
Write a deserialize function that rebuilds the tree from the serialized string
Use "#" to represent null nodes and commas "," to separate values
Print the serialized string and the inorder traversal of the deserialized tree
💡 Why This Matters
🌍 Real World
Saving and loading tree structures in databases, file systems, or network transmission often requires serialization and deserialization.
💼 Career
Understanding serialization is important for software engineers working with data storage, distributed systems, and APIs that exchange complex data.
Progress0 / 4 steps
1
Create the Binary Tree Node Structure and Sample Tree
Create a struct called TreeNode with an int val, and two pointers left and right. Then create a sample binary tree with root value 1, left child 2, and right child 3. The right child 3 should have two children: left 4 and right 5.
DSA C++
Hint
Define the struct with a constructor. Then create nodes and link them as described.
2
Add a Helper Function to Append Values to String
Create a helper function called void serializeHelper(TreeNode* node, std::string& str) that appends the node's value to str followed by a comma. If the node is nullptr, append "#," instead. Use preorder traversal (node, left, right).
DSA C++
Hint
Use preorder traversal: process current node, then left subtree, then right subtree. Use # for null nodes.
3
Implement the Deserialize Helper Function
Create a function TreeNode* deserializeHelper(std::istringstream& ss) that reads values separated by commas from ss. If the value is "#", return nullptr. Otherwise, create a new TreeNode with the integer value, then recursively build its left and right children by calling deserializeHelper.
DSA C++
Hint
Read each value from the string stream. Use recursion to rebuild left and right subtrees.
4
Serialize the Tree, Deserialize it, and Print Inorder Traversal
Create a function std::string serialize(TreeNode* root) that returns the serialized string by calling serializeHelper. Then create a function TreeNode* deserialize(const std::string& data) that uses deserializeHelper with a std::istringstream. Finally, write a function void inorder(TreeNode* root) that prints the tree values in inorder traversal separated by spaces. Call serialize on root, print the serialized string, then call deserialize on that string, and print the inorder traversal of the deserialized tree.
DSA C++
Hint
Use the helper functions to build serialize and deserialize. Then print the serialized string and the inorder traversal of the deserialized tree.
Practice
(1/5)
1. What is the main purpose of serialize and deserialize functions in the context of a binary tree?
easy
A. Find the height of the binary tree
B. Sort the binary tree nodes in ascending order
C. Delete all nodes of the binary tree
D. Convert a binary tree to a string and back to a binary tree
Solution
Step 1: Understand serialization
Serialization means converting a data structure like a binary tree into a string format that can be stored or transmitted.
Step 2: Understand deserialization
Deserialization means converting the string back into the original binary tree structure.
Final Answer:
Convert a binary tree to a string and back to a binary tree -> Option D
Quick Check:
Serialize/Deserialize = Convert tree to/from string [OK]
Hint: Think of serialize as packing, deserialize as unpacking [OK]
Common Mistakes:
Confusing serialization with sorting
Thinking it deletes nodes
Assuming it calculates tree height
2. Which of the following is a correct way to represent a null node during serialization of a binary tree in C++ using a single-character marker?
easy
A. "null"
B. "#"
C. 0
D. -1
Solution
Step 1: Identify common null markers
In many serialization methods, a special character like '#' is used to mark null nodes to distinguish them from valid node values.
Step 2: Compare options
"null" is a string but longer and less common; 0 and -1 can be valid node values, so they are ambiguous.
Final Answer:
"#" -> Option B
Quick Check:
Null node marker = "#" [OK]
Hint: Use a unique symbol like '#' for null nodes [OK]
Common Mistakes:
Using 0 or -1 which can be valid node values
Using the word "null" which is verbose
Not marking null nodes at all
3. Given the following serialized string of a binary tree using preorder traversal with '#' as null marker: "1 2 # # 3 4 # # 5 # #", what is the inorder traversal of the tree?
A. The stoi conversion can throw exception without try-catch
B. The index is incremented twice for null nodes causing skipping elements
C. The function does not handle empty input vector
D. The function does not assign right child correctly
Solution
Step 1: Identify the stoi vulnerability
The code uses stoi(data[index++]) without validating that data[index] is a valid integer string. Malformed input (non-numeric other than '#') causes unhandled std::invalid_argument exception.
Step 2: Rule out other options
Index increments once per token: for '#' via index++ in if; for values via index++ in stoi. Empty input handled by index >= data.size(). Right child assigned correctly.
Final Answer:
The stoi conversion can throw exception without try-catch -> Option A
Quick Check:
stoi requires valid numeric strings [OK]
Hint: Validate inputs before stoi to prevent exceptions [OK]
Common Mistakes:
Assuming no index increment for null nodes
Ignoring possible exceptions from stoi
Thinking right child assignment is missing
5. You want to serialize a binary tree and then deserialize it back. However, your tree contains integer node values that can be negative, zero, or positive. Which approach ensures correct serialization and deserialization without ambiguity?
hard
A. Serialize only node values ignoring nulls, reconstruct tree by sorting
B. Use comma-separated values but skip null markers to reduce size
C. Use space-separated values with '#' for nulls and convert strings to int using stoi
D. Serialize using preorder but replace negative values with zero
Solution
Step 1: Consider node values including negatives and zero
Using space-separated values with '#' for nulls preserves structure and allows negative values as strings can represent negatives.
Step 2: Evaluate other options
Use comma-separated values but skip null markers to reduce size skips nulls, losing tree shape. Serialize only node values ignoring nulls, reconstruct tree by sorting ignores nulls and sorts, losing original structure. Serialize using preorder but replace negative values with zero replaces negatives with zero, losing data.
Final Answer:
Use space-separated values with '#' for nulls and convert strings to int using stoi -> Option C
Quick Check:
Preserve nulls and convert strings properly [OK]
Hint: Keep null markers and convert strings carefully [OK]
Common Mistakes:
Skipping null markers losing tree shape
Replacing negative values losing data
Sorting nodes losing original tree
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.