1. 朴素法:普通递归
这是最直观的方法。从根节点开始递归,对于每个节点,检查是否是p或q,或者p和q是否在它的两侧子树中。如果是,那么这个节点就是LCA。
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 实现寻找最近公共祖先的函数
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (!root || root == p || root == q) return root;
TreeNode* left = lowestCommonAncestor(root->left, p, q);
TreeNode* right = lowestCommonAncestor(root->right, p, q);
// 如果p和q分别在root的两侧,那么root就是它们的最近公共祖先
if (left && right) return root;
// 否则,p和q都在一侧子树中,返回该子树的递归结果
return left ? left : right;
}
int lca(int root, int a, int b) {
if (!root)
return -1;
if (root == a || root == b)
return root;
int l = lca(lch[root], a, b);
int r = lca(rch[root], a, b);
if (l != -1 && r != -1)
return root;
if (r != -1)
return r;
if (l != -1)
return l;
return -1;
}