1use std::rc::Rc;
33use std::cell::RefCell;
34
35use crate::TreeNode;
36
37pub struct Solution;
38
39impl Solution {
40 pub fn invert_tree(root: Option<Rc<RefCell<TreeNode>>>) -> Option<Rc<RefCell<TreeNode>>> {
41 root.as_ref().map(|r| Solution::invert_node(&mut r.borrow_mut()));
42 root
43 }
44
45 fn invert_node(n: &mut TreeNode) {
46 if let Some(node) = n.left.as_ref() {
47 Solution::invert_node(&mut node.borrow_mut());
48 }
49 if let Some(node) = n.right.as_ref() {
50 Solution::invert_node(&mut node.borrow_mut());
51 }
52 std::mem::swap(&mut n.left, &mut n.right)
53 }
54}
55
56
57#[cfg(test)]
58mod tests {
59 use super::*;
60 use crate::tree;
61
62 #[test]
63 fn test() {
64 let t = |v| Solution::invert_tree(v);
65 assert_eq!(tree![4,7,2,9,6], t(tree![4,2,7,null,null,6,9]));
66 assert_eq!(tree![4,7,2,9,6,3,1], t(tree![4,2,7,1,3,6,9]));
67 assert_eq!(tree![4,7,2], t(tree![4,2,7]));
68 assert_eq!(tree![4,7], t(tree![4,null,7]));
69 assert_eq!(tree![4,null,2], t(tree![4,2]));
70 assert_eq!(tree![], t(tree![]));
71 }
72}