865. Smallest Subtree with all the Deepest Nodes

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 deepe

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.

From: LeetCode
Link: 865. Smallest Subtree with all the Deepest Nodes


Solution:

Ideas:
  • Do one post-order DFS that returns (maxDepth, nodeContainingAllDeepest) for each subtree.

  • For a null child, depth = -1 (so a leaf ends up at depth 0).

  • If leftDepth == rightDepth → current node is the LCA of all deepest nodes.

  • Else propagate the deeper child’s candidate upward, adding 1 to depth.

  • The final candidate node is the smallest subtree containing all deepest nodes.

Code:
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

struct Pair {
    int depth;                  // max depth below this node
    struct TreeNode* node;      // LCA of deepest nodes in this subtree
};

static struct Pair dfs(struct TreeNode* root) {
    if (!root) return (struct Pair){-1, NULL};   // null has depth -1

    struct Pair L = dfs(root->left);
    struct Pair R = dfs(root->right);

    if (L.depth == R.depth) {
        // current node is the LCA of deepest nodes from both sides
        return (struct Pair){L.depth + 1, root};
    } else if (L.depth > R.depth) {
        // deeper on the left; propagate left's candidate
        return (struct Pair){L.depth + 1, L.node};
    } else {
        // deeper on the right; propagate right's candidate
        return (struct Pair){R.depth + 1, R.node};
    }
}

struct TreeNode* subtreeWithAllDeepest(struct TreeNode* root) {
    return dfs(root).node;
}
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐