#include <stdio.h>
typedef struct _treeNode {
struct _treeNode *left, *right;
int data;
} treeNode;
// 在二叉树中找到两个节点的最近公共祖先
treeNode *findPorQ(treeNode *root, treeNode *p, treeNode *q) {
if (root == NULL || root == p || root == q) {
return root; // 当前节点为空,或者是p或q本身,返回当前节点
}
// 在左子树中递归查找p和q的最近公共祖先
treeNode *left = findPorQ(root->left, p, q);
// 在右子树中递归查找p和q的最近公共祖先
treeNode *right = findPorQ(root->right, p, q);
// 如果左子树中找不到,则返回右子树中找到的结果
if (left == NULL) {
return right;
}
// 如果右子树中找不到,则返回左子树中找到的结果
if (right == NULL) {
return left;
}
// 如果左右子树都找到了结果,则当前节点就是最近公共祖先
return root;
}
这个函数使用递归的方法在二叉树中查找两个给定节点 p
和 q
的最近公共祖先。它的基本思想是:
- 如果当前节点为空,或者当前节点就是
p
或q
,那么当前节点就是它们的最近公共祖先。 - 否则,递归地在左子树和右子树中查找
p
和q
的最近公共祖先。 - 如果左子树中找不到,则返回右子树中找到的结果。
- 如果右子树中找不到,则返回左子树中找到的结果。
- 如果左右子树都找到了结果,则当前节点就是最近公共祖先。
这种递归的思想基于二叉树的性质,能够在树中高效地找到最近公共祖先。