1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
struct Solution;
use rustgym_util::*;

trait Preorder {
    fn preorder(self, left: TreeLink, right: TreeLink) -> TreeLink;
}

impl Preorder for TreeLink {
    fn preorder(self, left: TreeLink, right: TreeLink) -> TreeLink {
        if let Some(node) = self {
            let left_tree = node.borrow_mut().left.take();
            let right_leaf = node.borrow_mut().right.take();
            node.borrow_mut().left = left;
            node.borrow_mut().right = right;
            left_tree.preorder(right_leaf, Some(node))
        } else {
            right
        }
    }
}

impl Solution {
    fn upside_down_binary_tree(root: TreeLink) -> TreeLink {
        root.preorder(None, None)
    }
}

#[test]
fn test() {
    let root = tree!(1, tree!(2, tree!(4), tree!(5)), tree!(3));
    let res = tree!(4, tree!(5), tree!(2, tree!(3), tree!(1)));
    assert_eq!(Solution::upside_down_binary_tree(root), res);
}