В обновлении к моему предыдущему ответу оказывается, что вы можете сделать это за один проход.Всякий раз, когда вы находите узел без дочерних элементов, сохраняйте указатель на него, когда текущая глубина превышает максимальную найденную глубину.
Node deepest_node = null;
void deepestNodeImpl(Node root, int max_depth, int cur_depth) {
if (!root) return;
if (!root.left && !root.right) {
if (cur_depth > max_depth) {
deepest_node = root;
max_depth = cur_depth;
}
return;
}
deepestNodeImpl(root.left, max_depth, cur_depth + 1);
deepestNodeImpl(root.right, max_depth, cur_depth + 1);
}
Node deepestNode(Node root) {
deepestNodeImpl(root, -1, 0);
return deepest_node;
}