LeetCode //C - 865. Smallest Subtree with all the Deepest Nodes
Article Summary:The task is to find the smallest subtree in a binary tree that contains all deepest nodes. Using a depth-first search (DFS), for each subtree, the maximum depth and the lowest common a
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;
}
更多推荐
所有评论(0)