Skip to main content
Back to problems
#865
Medium Algorithms

Smallest subtree with all the deepest nodes

Hash Table Tree Depth-First Search Breadth-First Search Binary Tree
77.5% acceptance
Feb 27, 2026
3259
401
Given the root of a binary tree, the depth of each node is the shortest distance to the root. Return the smallest subtree such that it contains all the deepest nodes in the original tree. A node is called the deepest if it has the largest depth possible among any node in the entire tree. The subtree of a node is a tree consisting of that node, plus the set of all descendants of that node.

Solution

Rust
Time O(n)
Space O(n)
LeetCode
solution.rs
/*
 * Given the root of a binary tree, the depth of each node is the shortest distance to the root.
 * Return the smallest subtree such that it contains all the deepest nodes in the original tree.
 * A node is called the deepest if it has the largest depth possible among any node in the entire tree.
 * The subtree of a node is a tree consisting of that node, plus the set of all descendants of that node.
 * Example 1:
 * Input: root = [3,5,1,6,2,0,8,null,null,7,4]
 * Output: [2,7,4]
 * Explanation: We return the node with value 2, colored in yellow in the diagram.
 * The nodes coloured in blue are the deepest nodes of the tree.
 * Notice that nodes 5, 3 and 2 contain the deepest nodes in the tree but node 2 is the smallest subtree among them, so we return it.
 * Example 2:
 * Input: root = [1]
 * Output: [1]
 * Explanation: The root is the deepest node in the tree.
 * Example 3:
 * Input: root = [0,1,3,null,2]
 * Output: [2]
 * Explanation: The deepest node in the tree is 2, the valid subtrees are the subtrees of nodes 2, 1 and 0 but the subtree of node 2 is the smallest.
 * Constraints:
 * The number of nodes in the tree will be in the range [1, 500].
 * 0 <= Node.val <= 500
 * The values of the nodes in the tree are unique.
 * Note: This question is the same as 1123: https://leetcode.com/problems/lowest-common-ancestor-of-deepest-leaves/
 */

use std::rc::Rc;
use std::cell::RefCell;
impl Solution {
  pub fn subtree_with_all_deepest(root: Option<Rc<RefCell<TreeNode>>>) -> Option<Rc<RefCell<TreeNode>>> {
    fn helper(node: &Option<Rc<RefCell<TreeNode>>>) -> (Option<Rc<RefCell<TreeNode>>>, i32) {
      match node {
        None => (None, 0),
        Some(n) => {
          let nb = n.borrow();
          let (l_node, l_depth) = helper(&nb.left);
          let (r_node, r_depth) = helper(&nb.right);
          if l_depth == r_depth {
            (Some(Rc::clone(n)), l_depth + 1)
          } else if l_depth > r_depth {
            (l_node, l_depth + 1)
          } else {
            (r_node, r_depth + 1)
          }
        }
      }
    }
    helper(&root).0
  }
}