假设二叉树采用链式方式存储,root为其根结点,p和q分别指向二叉树中任意两个结点,编写一个函数,返回p和q最近的共同祖先。用C语言写
时间: 2024-12-19 18:20:38 浏览: 14
在C语言中,可以编写一个函数来找到链式存储的二叉树中两个节点的最近公共祖先。由于是链式存储,我们可以从根节点开始逐层遍历,直到找到包含p和q的公共路径。这里假设`TreeNode`结构如下:
```c
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
struct TreeNode* parent; // 添加一个parent指针表示父节点
} TreeNode;
TreeNode* findLCA(TreeNode* root, TreeNode* p, TreeNode* q) {
if (root == NULL || root == p || root == q) {
return root;
}
TreeNode* left = findLCA(root->left, p, q);
TreeNode* right = findLCA(root->right, p, q);
// 如果p和q都在左子树或右子树,说明最近公共祖先在当前节点
if (left && right) {
return root;
} else if (left) {
return left;
} else {
return right;
}
}
```
这个`findLCA`函数首先检查根节点是否为空,或者是否就是p或q本身。如果是,那它就是最近的公共祖先。接着递归地在左右子树中查找,当发现p和q都出现在同一个子树(`left`和`right`都不为空)时,说明最近公共祖先就在当前节点。
阅读全文