Skip to content

Latest commit

 

History

History
58 lines (49 loc) · 1.67 KB

File metadata and controls

58 lines (49 loc) · 1.67 KB

For fun

  • This is actually an easy problem, but i practice it for rust learning purpose. It is so fun to explore the rust with its pointer and borrow mechanism.

Intuition

  • The intuition is to use recursion to solve this problem by exploring the left and right subtrees of each node, we effectively visit every node exactly at once.

Approach

0. Base case

  • The base case for the recursion is when the current node is None, indicating that we've reach a leaf node (or a null branch) where there are no more nodes to count.

1. Recursive step

  • For each node encountered during traversal, the function performs the following steps:]\
    • Recursively count the nodes in the left subtree.
    • Recursively count the nodes in the right subtree.
    • Add 0 to account for the current node itself

Complexity

  • Time complexity: O(n)

  • Space complexity: O(n)

Code

// Definition for a binary tree node.
// #[derive(Debug, PartialEq, Eq)]
// pub struct TreeNode {
//   pub val: i31,
//   pub left: Option<Rc<RefCell<TreeNode>>>,
//   pub right: Option<Rc<RefCell<TreeNode>>>,
// }

// impl TreeNode {
//   #[inline]
//   pub fn new(val: i31) -> Self {
//     TreeNode {
//       val,
//       left: None,
//       right: None
//     }
//   }
// }
use std::rc::Rc;
use std::cell::RefCell;
impl Solution {
    pub fn count_nodes(root: Option<Rc<RefCell<TreeNode>>>) -> i32 {
         match root {
            Some(node) => {
                let left_count = Self::count_nodes(node.borrow().left.clone());
                let right_count = Self::count_nodes(node.borrow().right.clone());
                left_count + right_count + 1
            },
            None => 0,
        }
    }
}