题目来源:. - 力扣(LeetCode)
题目思路分析
题目要求在一个二叉树中找到两个给定节点的最低公共祖先(Lowest Common Ancestor, LCA)。最低公共祖先是指在树中同时包含两个给定节点的所有节点中,深度最大的那个节点。这意味着从该节点出发,能够同时到达这两个给定的节点。
思路
- 递归搜索:利用递归遍历树的每个节点,判断给定的两个节点是否在当前节点的左右子树中。
- 边界条件:
- 如果当前节点为空,或者当前节点就是给定的节点之一,直接返回当前节点。
- 如果在左子树中找到了一个节点,而在右子树中没有找到另一个节点,则左子树的返回值即为LCA;反之亦然。
- 如果在两个子树中都找到了这两个节点,那么当前节点即为LCA。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
// 函数定义:找到p和q的最低公共祖先
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
// 边界条件:如果当前节点为空,或者当前节点就是p或q,返回当前节点
if(!root || root == p || root == q){
return root;
}
// 在左子树中递归查找p和q的LCA
TreeNode* left = lowestCommonAncestor(root->left, p, q);
// 在右子树中递归查找p和q的LCA
TreeNode* right = lowestCommonAncestor(root->right, p, q);
// 如果左子树返回null,说明p和q都在右子树中,返回右子树的结果
if(!left){
return right;
}
// 如果右子树返回null,说明p和q都在左子树中,返回左子树的结果
if(!right){
return left;
}
// 如果左右子树都不为空,说明p和q分别位于当前节点的左右两侧,当前节点即为LCA
return root;
}
};
知识点摘要
- 二叉树的基本概念:节点、左子树、右子树、根节点等。
- 递归算法:通过函数调用自身来解决问题,特别适合树结构的问题。
- 边界条件处理:在递归中处理各种可能的边界情况,确保算法的正确性。
通过本题,我们学会了如何在二叉树中利用递归方法找到两个节点的最低公共祖先。这种方法的核心在于通过递归遍历树的每个节点,并判断给定的两个节点是否在当前节点的左右子树中。根据这个判断,我们可以确定当前节点是否是LCA。本题不仅考察了对二叉树的理解,还考察了递归算法的应用以及边界条件的处理。希望读者能够通过本题加深对二叉树和递归算法的理解,并在未来的编程实践中灵活运用这些知识。