rustgym/leetcode/
_814_binary_tree_pruning.rs1struct Solution;
2use rustgym_util::*;
3
4trait Postorder {
5 fn postorder(self) -> Self;
6}
7
8impl Postorder for TreeLink {
9 fn postorder(self) -> Self {
10 if let Some(node) = self {
11 let val = node.borrow().val;
12 let left = node.borrow_mut().left.take();
13 let right = node.borrow_mut().right.take();
14 let left = left.postorder();
15 let right = right.postorder();
16 if left.is_none() && right.is_none() && val == 0 {
17 None
18 } else {
19 tree!(val, left, right)
20 }
21 } else {
22 None
23 }
24 }
25}
26
27impl Solution {
28 fn prune_tree(root: TreeLink) -> TreeLink {
29 root.postorder()
30 }
31}
32
33#[test]
34fn test() {
35 let root = tree!(1, None, tree!(0, tree!(0), tree!(1)));
36 let res = tree!(1, None, tree!(0, None, tree!(1)));
37 assert_eq!(Solution::prune_tree(root), res);
38 let root = tree!(
39 1,
40 tree!(0, tree!(0), tree!(0)),
41 tree!(1, tree!(0), tree!(1))
42 );
43 let res = tree!(1, None, tree!(1, None, tree!(1)));
44 assert_eq!(Solution::prune_tree(root), res);
45 let root = tree!(
46 1,
47 tree!(1, tree!(1, tree!(0), None), tree!(1)),
48 tree!(0, tree!(0), tree!(1))
49 );
50 let res = tree!(1, tree!(1, tree!(1), tree!(1)), tree!(0, None, tree!(1)));
51 assert_eq!(Solution::prune_tree(root), res);
52}