使用c语言完成在二叉排序树上找出任意两个不同结点的最近公共祖先
时间: 2024-12-23 07:22:53 浏览: 7
编写算法,在二叉排序树上找出任意两个不同结点的最近公共祖先.doc
在C语言中,找到二叉排序树(BST)上任意两个不同节点的最近公共祖先(LCA,Least Common Ancestor)可以通过一次遍历(通常是先序遍历)来实现,利用BST的特性——左子树的所有节点值都小于根节点值,右子树的所有节点值都大于根节点值。以下是算法的基本思路:
1. 先确定两个节点`p`和`q`在树中的位置:如果`p`在`q`的左侧(包括等于的情况),那么LCA就在`q`的路径上;反之,如果`q`在`p`的左侧,则LCA在`p`的路径上。
2. 从根节点开始,比较目标节点与当前节点的位置,如果发现有在对方路径上,就逐步向上移动直到相遇,这就是LCA。
下面是简单的C代码实现:
```c
TreeNode* findLCA(TreeNode* root, TreeNode* p, TreeNode* q) {
if (root == NULL || root == p || root == q)
return root;
// 检查p 和 q分别在哪一侧
if (root->val > p->val && root->val > q->val)
return findLCA(root->left, p, q);
else if (root->val < p->val && root->val < q->val)
return findLCA(root->right, p, q);
return root; // LCA 在当前节点
}
```
这里假设`TreeNode`结构包含`val`(节点值),`left`, `right`指针。
阅读全文