给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 用C语言实现一下
时间: 2024-12-21 18:25:09 浏览: 32
在 C 语言中,我们可以使用递归的方式来解决这个问题。首先,我们需要定义一个结构体 `Node` 来表示二叉树的节点,包括值和指向左右子节点的指针。接下来,编写一个名为 `findLCA` 的函数,接收两个节点 `p` 和 `q` 作为参数,返回它们的最近公共祖先。
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构体
typedef struct Node {
int val;
struct Node* left;
struct Node* right;
} Node;
// 插入新节点到二叉树
void insert(Node** root, int val) {
if (*root == NULL) {
*root = (Node*)malloc(sizeof(Node));
(*root)->val = val;
(*root)->left = NULL;
(*root)->right = NULL;
} else if (val < (*root)->val) {
insert(&(*root)->left, val);
} else {
insert(&(*root)->right, val);
}
}
// 递归查找最近公共祖先
Node* findLCA(Node* root, Node* p, Node* q) {
if (root == NULL || root == p || root == q) {
return root;
}
// 分别尝试左子树和右子树
Node* left = findLCA(root->left, p, q);
Node* right = findLCA(root->right, p, q);
// 如果在两边都有找到,说明当前节点就是LCA
if (left && right)
return root;
// 如果只在一侧找到,说明另一侧的节点就是LCA
else if (left)
return left;
else if (right)
return right;
}
int main() {
// 初始化示例树并插入节点
Node* root = NULL;
insert(&root, 6);
insert(&root, 2);
insert(&root, 8);
insert(&root, 0);
insert(&root, 4);
insert(&root, 7);
insert(&root, 9);
insert(&root, 3);
// 示例查找最近公共祖先
Node* p = findLCA(root, root->left, root->right); // 2和6
Node* q = findLCA(root, root->right, root->right->right); // 6和9
printf("The LCA of nodes %d and %d is %d.\n", p->val, q->val, p->val); // 输出最近公共祖先的值
return 0;
}
```
以上代码实现了二叉查找树(BST)中两个节点的最近公共祖先查找。请注意,这里假设输入的树是一个排序的二叉树,如果输入的不是这样的结构,可能需要稍微修改插入函数。
阅读全文