1448. Count Good Nodes in Binary Tree

Description of Problem

Given a binary tree root, a node X in the tree is named good if in the path from root to X there are no nodes with a value greater than X.

Return the number of good nodes in the binary tree.

Example 1:

Input: root = [3,1,4,3,null,1,5]
Output: 4
Explanation: Nodes in blue are good.
Root Node (3) is always a good node.
Node 4 -> (3,4) is the maximum value in the path starting from the root.
Node 5 -> (3,4,5) is the maximum value in the path
Node 3 -> (3,1,3) is the maximum value in the path.

Example 2:

Input: root = [3,3,null,4,2]
Output: 3
Explanation: Node 2 -> (3, 3, 2) is not good, because "3" is higher than it.

Example 3:

Input: root = [1]
Output: 1
Explanation: Root is considered as good.

Constraints:

  • The number of nodes in the binary tree is in the range [1, 10^5].
  • Each node's value is between [-10^4, 10^4].

Solution

Tags: Binary Tree DFS

Explanation

When doing DFS, keep track the current maximum value of the path and the answer (count of good nodes).

Code

// 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 good_nodes(root: Option<Rc<RefCell<TreeNode>>>) -> i32 {
        let mut count = 0;
        Self::dfs(root, i32::MIN, &mut count);
        return count;
    }

    fn dfs(node : Option<Rc<RefCell<TreeNode>>>, max : i32, count : &mut i32){
        if let Some(n) = node {
            let n = n.borrow();
            if n.val >= max {
                *count += 1;
            }
            let max = max.max(n.val);
            Self::dfs(n.left.clone(), max, count);
            Self::dfs(n.right.clone(), max, count);
        }
    }
}

Complexity

  • n is the number of nodes in the tree
  • h is the height of the tree

Time complexity:

  • \( T(n) = \Theta(n) \)

Auxiliary Space:

  • \( S(n) = O(h) \)