[LeetCode] 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 tree consisting of that node, plus the set of all descendants of that node.

Note: This question is the same as 1123: https://leetcode.com/problems/lowest-common-ancestor-of-deepest-leaves/

Example 1:

[LeetCode] 865. Smallest Subtree with all the Deepest Nodes

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.

具有所有最深节点的最小子树。

给定一个根为 root 的二叉树,每个节点的深度是 该节点到根的最短距离 。

如果一个节点在 整个树 的任意节点之间具有最大的深度,则该节点是 最深的 。

一个节点的 子树 是该节点加上它的所有后代的集合。

返回能满足 以该节点为根的子树中包含所有最深的节点 这一条件的具有最大深度的节点。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/smallest-subtree-with-all-the-deepest-nodes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路是DFS + memorization,这里我先提供一个遍历两次的思路。既然找的是一棵最小的子树,但是这棵子树包含一个深度最大的节点(也就是距离根节点最远的节点),那么首先我们要做的就是记录下树中每个节点的深度,这里我选择用hashmap记录。第二次遍历的时候我们用dfs分别去看左子树和右子树,看哪个子树上返回的深度更大,则递归去看那个子树。

时间O(n)

空间O(n)

Java实现

 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode() {}
 8  *     TreeNode(int val) { this.val = val; }
 9  *     TreeNode(int val, TreeNode left, TreeNode right) {
10  *         this.val = val;
11  *         this.left = left;
12  *         this.right = right;
13  *     }
14  * }
15  */
16 class Solution {
17     public TreeNode subtreeWithAllDeepest(TreeNode root) {
18         // corner case
19         if (root == null) {
20             return null;
21         }
22         // normal case
23         HashMap<TreeNode, Integer> map = new HashMap<>();
24         depth(root, map);
25         return dfs(root, map);
26     }
27 
28     private int depth(TreeNode root, HashMap<TreeNode, Integer> map) {
29         if (root == null) {
30             return 0;
31         }
32         if (map.containsKey(root)) {
33             return map.get(root);
34         }
35         int max = Math.max(depth(root.left, map), depth(root.right, map)) + 1;
36         map.put(root, max);
37         return max;
38     }
39 
40     private TreeNode dfs(TreeNode root, HashMap<TreeNode, Integer> map) {
41         int left = depth(root.left, map);
42         int right = depth(root.right, map);
43         if (left == right) {
44             return root;
45         }
46         if (left > right) {
47             return dfs(root.left, map);
48         } else {
49             return dfs(root.right, map);
50         }
51     }
52 }

 

相关题目

235. Lowest Common Ancestor of a Binary Search Tree

236. Lowest Common Ancestor of a Binary Tree

865. Smallest Subtree with all the Deepest Nodes

LeetCode 题目总结

上一篇:网络爬虫的C++程序


下一篇:222. Count Complete Tree Nodes