思路分析:
length
函数用于计算以当前节点为根的子树的深度。采用递归的方式,返回左子树和右子树深度的较大值加1。lcaDeepestLeaves
函数是主函数,用于找到二叉树中最深叶子节点的最近公共祖先。- 首先检查根节点是否为空,如果为空则返回NULL。
- 然后判断左子树和右子树的深度是否相等,如果相等说明当前节点是最深叶子节点的最近公共祖先,直接返回当前节点。
- 如果左子树的深度大于右子树,递归调用左子树;如果右子树的深度大于左子树,递归调用右子树。
- 最终,通过递归的方式在树中找到最深叶子节点的最近公共祖先。
※重点:
当左右子树的深度相同时,意味着在当前节点的两个子树中,最深的叶子节点具有相同的深度。这是因为在二叉树中,从当前节点到最深叶子节点的路径长度相同。
因为我们要找的是最深叶子节点的最近公共祖先,所以如果左右子树的深度相同,那么当前节点就是这两个最深叶子节点的最近公共祖先。这是因为在二叉树中,最近公共祖先是指两个节点最深的共同祖先,而当前节点是它们的共同祖先,并且深度最大。
class Solution {
// 辅助函数:计算以当前节点为根的子树的深度
int length(TreeNode *root) {
// 如果节点为空,返回深度为0
if (root == NULL)
return 0;
// 递归计算左子树和右子树的深度
int left = length(root->left);
int right = length(root->right);
// 返回以当前节点为根的子树的深度
return 1 + max(left, right);
}
public:
// 主函数:找到二叉树中最深叶子节点的最近公共祖先
TreeNode* lcaDeepestLeaves(TreeNode* root) {
// 如果根节点为空,返回NULL
if (root == NULL)
return NULL;
// 如果左子树和右子树的深度相等,说明当前节点是最深叶子节点的最近公共祖先
if (length(root->left) == length(root->right))
return root;
// 如果左子树的深度大于右子树,递归调用左子树
else if ((length(root->left) > length(root->right)))
return lcaDeepestLeaves(root->left);
// 如果右子树的深度大于左子树,递归调用右子树
else
return lcaDeepestLeaves(root->right);
}
};