C语言大厂面试经典题目:寻找二叉树中两个节点的最近公共祖先节点
作者:野牛程序员:2023-12-04 15:46:17c语言阅读 4307
编写函数寻找最近公共祖先: 创建一个函数 lowestCommonAncestor,用于在二叉树中寻找两个节点的最近公共祖先。这个函数通过递归的方式实现。基本思路是:
如果当前节点为空,或者找到了其中一个目标节点,就返回当前节点。
在左子树中递归查找最近公共祖先。
在右子树中递归查找最近公共祖先。
如果在左右子树中都找到了目标节点,则当前节点为最近公共祖先。
以下是使用 C 语言实现的二叉树节点结构和寻找最近公共祖先的代码示例:
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
// 在二叉树中寻找两个节点的最近公共祖先
struct TreeNode* lowestCommonAncestor(struct TreeNode* root, struct TreeNode* p, struct TreeNode* q) {
// 如果树为空,或者找到了 p 或 q,则返回当前节点
if (!root || root == p || root == q) {
return root;
}
// 在左子树中递归查找最近公共祖先
struct TreeNode* left = lowestCommonAncestor(root->left, p, q);
// 在右子树中递归查找最近公共祖先
struct TreeNode* right = lowestCommonAncestor(root->right, p, q);
// 如果在左右子树中都找到了 p 和 q,则当前节点为最近公共祖先
if (left && right) {
return root;
}
// 如果只在左子树中找到了 p 或 q,则返回左子树的结果
// 反之,如果只在右子树中找到了 p 或 q,则返回右子树的结果
return left ? left : right;
}
// 创建新的二叉树节点
struct TreeNode* createNode(int val) {
struct TreeNode* newNode = (struct TreeNode*)malloc(sizeof(struct TreeNode));
newNode->val = val;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
int main() {
// 构建一棵二叉树
// 3
// / \\
// 5 1
// / \\ / \\
// 6 2 0 8
// / \\
// 7 4
struct TreeNode* root = createNode(3);
root->left = createNode(5);
root->right = createNode(1);
root->left->left = createNode(6);
root->left->right = createNode(2);
root->right->left = createNode(0);
root->right->right = createNode(8);
root->left->right->left = createNode(7);
root->left->right->right = createNode(4);
// 需要找的两个节点
struct TreeNode* p = root->left;
struct TreeNode* q = root->right;
// 找到最近公共祖先
struct TreeNode* result = lowestCommonAncestor(root, p, q);
// 输出最近公共祖先的值
printf("Lowest Common Ancestor: %d\\n", result->val);
// 释放内存
free(root->left->right->right);
free(root->left->right->left);
free(root->left->right);
free(root->left->left);
free(root->left);
free(root->right->right);
free(root->right->left);
free(root->right);
free(root);
return 0;
}这个示例创建了一个简单的二叉树,然后调用 lowestCommonAncestor 函数找到节点 p 和节点 q 的最近公共祖先,并输出其值。在程序的结尾部分,释放了动态分配的内存。
野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892

