Step 1: Start serialization at root node 1
Serialize: "1,"
Why: We record the root value first to start the string
Step 2: Serialize left subtree of 1 (node 2)
Serialize: "1,2,"
Why: We record left child value next
Step 3: Serialize left child of 2 which is null
Serialize: "1,2,null,"
Why: We mark null to remember no left child
Step 4: Serialize right child of 2 which is null
Serialize: "1,2,null,null,"
Why: We mark null to remember no right child
Step 5: Serialize right subtree of 1 (node 3)
Serialize: "1,2,null,null,3,"
Why: We record right child value after left subtree
Step 6: Serialize left child of 3 (node 4)
Serialize: "1,2,null,null,3,4,"
Why: We record left child of 3
Step 7: Serialize left and right children of 4 which are null
Serialize: "1,2,null,null,3,4,null,null,"
Why: Mark nulls for 4's children
Step 8: Serialize right child of 3 (node 5) and its null children
Serialize: "1,2,null,null,3,4,null,null,5,null,null,"
Why: Complete serialization with right subtree
Step 9: Start deserialization from string
Deserialize: reading "1" creates root node 1
Why: We rebuild root first
Step 10: Deserialize left subtree from next tokens "2,null,null"
Deserialize: node 2 with null children attached to root
Why: Rebuild left subtree exactly
Step 11: Deserialize right subtree from tokens "3,4,null,null,5,null,null"
Deserialize: node 3 with children 4 and 5 rebuilt
Why: Rebuild right subtree exactly
Result: Final tree rebuilt exactly as original:
1
/ \
2 3
/ \
4 5