LeetCode 0865. Smallest Subtree with all the Deepest Nodes Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0
0865. Smallest Subtree with all the Deepest Nodes

Description

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/

Solutions

Solution 1: Recursion

We design a function dfs(root) that returns the smallest subtree containing all the deepest nodes in the subtree rooted at root, as well as the depth of the subtree rooted at root.

The execution process of the function dfs(root) is as follows:

  • If root is null, return null and 0.
  • Otherwise, recursively calculate the smallest subtree and depth of the left and right subtrees of root, denoted as l and ld, and r and rd, respectively. If ld > rd, then the smallest subtree containing all the deepest nodes in the subtree rooted at the left child of root is l, with a depth of ld + 1. If ld < rd, then the smallest subtree containing all the deepest nodes in the subtree rooted at the right child of root is r, with a depth of rd + 1. If ld = rd, then root is the smallest subtree containing all the deepest nodes, with a depth of ld + 1.

Finally, return the first element of the result of dfs(root).

The time complexity is O(n), and the space complexity is O(n). Here, n is the number of nodes in the binary tree.

PythonJavaC++GoTypeScriptRust
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def subtreeWithAllDeepest(self, root: Optional[TreeNode]) -> Optional[TreeNode]: def dfs(root: Optional[TreeNode]) -> Tuple[Optional[TreeNode], int]: if root is None: return None, 0 l, ld = dfs(root.left) r, rd = dfs(root.right) if ld > rd: return l, ld + 1 if ld < rd: return r, rd + 1 return root, ld + 1 return dfs(root)[0](code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !