c++算法实现,在二叉排序树上找出任意两个不同结点的最近公共祖先
时间: 2024-12-20 15:28:03 浏览: 6
在C++中,为了在二叉搜索树(BST)上找到任意两个不同节点的最近公共祖先(LCA),我们可以利用二叉搜索树的特性。这里有一个递归方法可以实现:
首先,假设我们有一个函数`findLCA(TreeNode* root, TreeNode* p, TreeNode* q)`,其中`TreeNode`是二叉搜索树节点的结构体,包含整数值`val`、左孩子指针`left`和右孩子指针`right`。函数接受三个参数:根节点root,以及待查找的两个节点p和q。
1. **基本情况**:
- 如果`root == nullptr` 或者 `root == p` 或 `root == q`,那么返回`root`,因为根节点本身可能是它们的公共祖先。
- 如果`p.val < root.val` 并且`q.val >= root.val`,说明p在根的左半部分,而q在右半部分或等于根。这时,LCA在`root`的左子树中,所以我们递归地在`root.left`寻找。
- 如果相反,即`p.val > root.val` 并且`q.val <= root.val`,则LCA在`root`的右子树中,我们在`root.right`递归地找。
2. **递归逻辑**:
- 否则,我们继续分别在左右子树里查找p和q的LCA,如果它们都在同一边,则当前节点就是LCA;如果不在同一边,那么当前节点肯定不是LCA,因为它在p和q之间,所以直接返回当前节点即可。
这是一个典型的分治策略,递归会在最短路径上停止,找到最近的共同祖先。
```cpp
TreeNode* findLCA(TreeNode* root, TreeNode* p, TreeNode* q) {
if (!root || root == p || root == q)
return root;
if (p->val < root->val && q->val >= root->val)
return findLCA(root->left, p, q);
else if (p->val > root->val && q->val <= root->val)
return findLCA(root->right, p, q);
// 当p和q分别位于root的两侧时
return root;
}
```
阅读全文