[−][src]Function leetcode_for_rust::cd0145_binary_tree_postorder_traversal::postorder_traversal
pub fn postorder_traversal(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<i32>
Solutions
Approach 1: Recursive Approach
-
Time complexity: O(n)
-
Space complexity: O(logn)
-
Runtime: 0 ms
-
Memory: 2.4 MB
// Definition for a binary tree node. // #[derive(Debug, PartialEq, Eq)] // pub struct TreeNode { // pub val: i32, // pub left: Option<Rc<RefCell<TreeNode>>>, // pub right: Option<Rc<RefCell<TreeNode>>>, // } // // impl TreeNode { // #[inline] // pub fn new(val: i32) -> Self { // TreeNode { // val, // left: None, // right: None // } // } // } use std::rc::Rc; use std::cell::RefCell; impl Solution { pub fn postorder_traversal(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<i32> { let mut result: Vec<i32> = vec![]; if root.is_none() { return result; } Self::_post_order(root, &mut result); result } fn _post_order(root: Option<Rc<RefCell<TreeNode>>>, result: &mut Vec<i32>) { match root { Some(node) => { Self::_post_order(node.borrow().left.clone(), result); Self::_post_order(node.borrow().right.clone(), result); result.push(node.borrow().val); }, None => { return; } } } }
Approach 2: Iterating method using Stack
-
Time complexity: O(n)
-
Space complexity: O(n)
-
Runtime: 0 ms
-
Memory: 2.4 MB
// Definition for a binary tree node. // #[derive(Debug, PartialEq, Eq)] // pub struct TreeNode { // pub val: i32, // pub left: Option<Rc<RefCell<TreeNode>>>, // pub right: Option<Rc<RefCell<TreeNode>>>, // } // // impl TreeNode { // #[inline] // pub fn new(val: i32) -> Self { // TreeNode { // val, // left: None, // right: None // } // } // } use std::rc::Rc; use std::cell::RefCell; impl Solution { pub fn postorder_traversal(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<i32> { let mut result = vec![]; if root.is_none() { return result; } let mut stack1: Vec<Option<Rc<RefCell<TreeNode>>>> = Vec::new(); let mut stack2: Vec<Option<Rc<RefCell<TreeNode>>>> = Vec::new(); stack1.push(root); while let Some(Some(node)) = stack1.pop() { if node.borrow().left.is_some() { stack1.push(node.borrow().left.clone()); } if node.borrow().right.is_some() { stack1.push(node.borrow().right.clone()); } stack2.push(Some(node)); } while let Some(Some(node)) = stack2.pop() { result.push(node.borrow().val); } result } }