给定一个由 N 个节点组成的二叉树,这些节点的值来自范围 [1, N] 且互不相同,我们的任务是找到该二叉树最深叶节点的最近公共祖先。
示例:
> 输入:
>
>
>
>
>
> !image
>
>
>
>
>
> 输出: 1
> 解释: 树的最深叶节点是 {8, 9, 10}。这些节点的最近公共祖先是 1。
>
>
>
>
>
> 输入:
>
>
>
>
>
> !image
>
>
>
>
>
> 输出: 6
方法: 我们可以通过先找到树的最大深度,然后执行深度优先搜索遍历(DFS Traversal)来寻找最近公共祖先,从而解决给定的问题。请按照以下步骤解决问题:
- 找到二叉树的最大深度并将其存储在一个变量中,比如 depth。
- 声明一个函数,比如 DFS(root, curr) ,用于查找处于 depth 层级的节点的最长公共子序列(LCS):
- 如果 root 为 NULL,则返回 NULL。
- 如果 curr 的值等于 depth,则返回当前节点。
- 递归调用左子树,即 DFS(root->left, curr + 1),并将返回值存储在一个变量中,比如 left。
- 递归调用右子树,即 DFS(root->right, curr + 1) ,并将返回值存储在一个变量中,比如 right。
- 如果 left 和 right 的值均非空,则返回当前节点,因为当前节点就是最近公共祖先。
- 如果 left 非空,则返回 left。否则,返回 right。
- 完成上述步骤后,打印函数调用 DFS(root, 0) 返回的值。
下面是上述方法的实现:
C++
CODEBLOCK_c1547e28
Java
“
// Java program for the above approach
// Node of a Binary Tree
class Node
{
Node left = null;
Node right = null;
int data;
Node(int data)
{
this.data = data;
}
}
class GFG{
// Function to find the depth
// of the Binary Tree
public static int findDepth(Node root)
{
// If root is not null