leetcode_rust/
binary_tree_postorder_traversal.rs

1#![allow(dead_code)]
2
3use std::cell::RefCell;
4use std::rc::Rc;
5
6use crate::binary_tree::TreeNode;
7
8pub fn postorder_traversal(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<i32> {
9    let mut res = vec![];
10    postorder(root, &mut res);
11    res
12}
13
14fn postorder(root: Option<Rc<RefCell<TreeNode>>>, mut res: &mut Vec<i32>) {
15    match root {
16        None => {}
17        Some(node) => {
18            postorder(node.borrow().left.clone(), &mut res);
19            postorder(node.borrow().right.clone(), &mut res);
20            res.push(node.borrow().val);
21        }
22    }
23}
24
25#[cfg(test)]
26mod tests {
27    use super::*;
28
29    #[test]
30    fn test1() {
31        let tree = Some(Rc::new(RefCell::new(TreeNode {
32            val: 1,
33            left: None,
34            right: Some(Rc::new(RefCell::new(TreeNode {
35                val: 2,
36                left: Some(Rc::new(RefCell::new(TreeNode {
37                    val: 3,
38                    left: None,
39                    right: None,
40                }))),
41                right: None,
42            }))),
43        })));
44        let res = postorder_traversal(tree);
45        assert_eq!(res, vec![3, 2, 1]);
46    }
47}