1use crate::TreeNode;
39
40use std::rc::Rc;
41use std::cell::RefCell;
42
43pub struct Codec {}
44
45impl Codec {
50 fn new() -> Self {
51 Self {}
52 }
53
54 fn ser(&self, root: Option<Rc<RefCell<TreeNode>>>) -> Vec<Option<i32>> {
55 root.map_or(vec![None], |node| {
56 let mut node = node.as_ref().borrow_mut();
57 let left = node.left.take();
58 let right = node.right.take();
59 let mut l = self.ser(left);
60 let mut r = self.ser(right);
61 let mut res = vec![];
62 res.append(&mut l);
63 res.append(&mut r);
64 res.append(&mut vec![Some(node.val)]);
65 res
66 })
67 }
68
69 pub fn serialize(&self, root: Option<Rc<RefCell<TreeNode>>>) -> String {
70 self.ser(root).iter().map(|v| {
71 v.map_or("".to_string(), |v| format!("{}", v)) }).collect::<Vec<_>>().as_slice().join(" ")
72 }
73
74 fn des(&self, data: &mut Vec<Option<i32>>) -> Option<Rc<RefCell<TreeNode>>> {
75 if data.is_empty() {
76 return None;
77 }
78
79 data.pop().and_then(|val| val).map(|val| {
80 let right = self.des(data);
81 let left = self.des(data);
82 let node = TreeNode {
83 val,
84 left: left,
85 right: right,
86 };
87 Rc::new(RefCell::new(node))
88 })
89 }
90
91 pub fn deserialize(&self, data: String) -> Option<Rc<RefCell<TreeNode>>> {
92 if data.is_empty() {
93 return None;
94 }
95 let mut d: Vec<Option<i32>> = data.split(' ').map(|s| {
96 s.parse().ok()
97 }).collect();
98 self.des(&mut d)
99 }
100}
101
102#[cfg(test)]
110mod tests {
111 use crate::tree;
112 use super::*;
113
114 #[test]
115 fn test() {
116 let codec = Codec::new();
117 let t = |n| codec.deserialize(codec.serialize(n));
118 assert_eq!(tree![2,1,3], t(tree![2,1,3]));
119 assert_eq!(tree![], t(tree![]));
120 assert_eq!(tree![4,2,7,1,3,6,9], t(tree![4,2,7,1,3,6,9]));
121 assert_eq!(tree![4,2,7,null,null,6,9], t(tree![4,2,7,null,null,6,9]));
122 }
123}