Given a tree, find the smallest subtree that contains all of the tree's deepest nodes.
a
/ | \
b c d
/ \ | . 1point3acres.com/bbs
e f g
/ / \
h i j . more info on 1point3acres.com
depth of tree: 4
deepest nodes:[h,i,j]
least common ancestor of [h,i,j]: b
a
/ | \
b c d
/ \ | . 1point3acres.com/bbs
e f g
/ / \
h i j . more info on 1point3acres.com
depth of tree: 4
deepest nodes:[h,i,j]
least common ancestor of [h,i,j]: b
return: b
public TreeNode minSubtreeDeepestLeaf(TreeNode root) {
// record the deepest depth under each node in a map
// for a parent, if left and right subtree have the same
// deepest depth, return the parent node itself,
// otherwise, return the subtree with deepest child
if (root == null) {
return root;
}
Map<TreeNode, Integer> map = new HashMap<>();
return helper(root, map, 1);
}
private TreeNode helper(TreeNode root, Map<TreeNode, Integer> map, int depth) {
if (root.left == null && root.right == null) {
map.put(root, depth);
return root;
}
if (root.left == null) {
return helper(root.right, map, depth + 1);
}
if (root.right == null) {
return helper(root.left, map, depth + 1);
}
TreeNode leftResult = helper(root.left, map, depth + 1);
TreeNode rightResult = helper(root.right, map, depth + 1);
if (map.get(leftResult) == map.get(rightResult)) {
map.put(root, map.get(leftResult));
return root;
}
return map.get(leftResult) > map.get(rightResult) ? leftResult : rightResult;
}