编写算法,在二叉排序树上找出任意两个不同结点的最近公共祖先。C++代码实现
时间: 2024-12-20 16:28:00 浏览: 5
Origin教程009所需练习数据
在二叉排序树(BST)上找到任意两个节点的最近公共祖先(LCA)通常采用递归的方式。二叉排序树的特点是左子树的所有节点值都小于根节点,右子树的所有节点值都大于根节点。因此,对于任意两个节点A和B,如果它们在同一侧(即都在左子树或右子树),那么它们的LCA将在它们共同父节点处;如果分别在两侧,则最近公共祖先将是它们路径上的最后一个公共节点。
以下是C++的基本递归实现:
```cpp
class TreeNode {
public:
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (!root || root == p || root == q) return root;
// 分别检查左子树和右子树
TreeNode* left_lca = lowestCommonAncestor(root->left, p, q);
TreeNode* right_lca = lowestCommonAncestor(root->right, p, q);
// 如果p和q都在左子树或右子树,返回当前节点
if (left_lca && right_lca)
return root;
else
return left_lca ? left_lca : right_lca;
}
```
这个函数`lowestCommonAncestor`接受三个参数:根节点、节点P和节点Q。它首先检查当前节点是否是P或Q,如果是就直接返回。然后递归地在左右子树中寻找LCA,最后确定并返回结果。
阅读全文