求二叉排序树中两个结点的最近公共祖先完整代码c
时间: 2024-02-27 08:51:46 浏览: 69
以下是二叉排序树中两个结点的最近公共祖先的完整代码(C语言实现):
```c
#include <stdio.h>
#include <stdlib.h>
// 二叉排序树结点定义
typedef struct BSTNode {
int data;
struct BSTNode *left;
struct BSTNode *right;
} BSTNode;
// 创建二叉排序树结点
BSTNode *createBSTNode(int data) {
BSTNode *node = (BSTNode *)malloc(sizeof(BSTNode));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
// 插入结点到二叉排序树
BSTNode *insertBSTNode(BSTNode *root, int data) {
if (root == NULL) {
root = createBSTNode(data);
} else if (data < root->data) {
root->left = insertBSTNode(root->left, data);
} else if (data > root->data) {
root->right = insertBSTNode(root->right, data);
}
return root;
}
// 查找二叉排序树中某个结点
BSTNode *searchBSTNode(BSTNode *root, int data) {
if (root == NULL) {
return NULL;
}
if (data == root->data) {
return root;
} else if (data < root->data) {
return searchBSTNode(root->left, data);
} else {
return searchBSTNode(root->right, data);
}
}
// 查找二叉排序树中两个结点的最近公共祖先
BSTNode *findLCA(BSTNode *root, int data1, int data2) {
if (root == NULL) {
return NULL;
}
if (data1 < root->data && data2 < root->data) {
return findLCA(root->left, data1, data2);
} else if (data1 > root->data && data2 > root->data) {
return findLCA(root->right, data1, data2);
} else {
return root;
}
}
// 释放二叉排序树的空间
void freeBST(BSTNode *root) {
if (root == NULL) {
return;
}
freeBST(root->left);
freeBST(root->right);
free(root);
}
int main() {
// 创建二叉排序树
BSTNode *root = NULL;
root = insertBSTNode(root, 6);
root = insertBSTNode(root, 2);
root = insertBSTNode(root, 8);
root = insertBSTNode(root, 1);
root = insertBSTNode(root, 4);
root = insertBSTNode(root, 3);
root = insertBSTNode(root, 5);
root = insertBSTNode(root, 7);
root = insertBSTNode(root, 9);
// 查找两个结点的最近公共祖先
int data1 = 3;
int data2 = 5;
BSTNode *lca = findLCA(root, data1, data2);
printf("The LCA of %d and %d is %d\n", data1, data2, lca->data);
// 释放二叉排序树的空间
freeBST(root);
return 0;
}
```
代码中,我们先创建了一个二叉排序树,并插入了一些结点。然后,我们调用 `findLCA` 函数查找给定两个结点的最近公共祖先,并输出结果。最后,我们释放了二叉排序树的空间,避免内存泄漏。
阅读全文