c++编写函数,实现求解二叉树中两个节点的最近公共祖先
时间: 2024-11-06 10:13:34 浏览: 1
使用C语言求二叉树结点的最低公共祖先的方法
在 C++ 中,为了找到二叉树中两个节点的最近公共祖先(LCA),我们可以采用递归的方法,结合对每个节点的左右子树分别进行查找。如果目标节点 A 和 B 都在一个非空的子树中,那么 LCA 就在这个子树的根节点上;否则,LCA 应该在 A 的左子树和 B 的右子树的交集,或者是 A 的右子树和 B 的左子树的交集中。
以下是基本的算法步骤:
1. 如果当前节点为空,或者其中一个目标节点不在当前节点的范围内,则返回空;
2. 检查当前节点是否同时包含目标节点 A 和 B,如果是,说明找到了 LCA,返回当前节点;
3. 否则,递归地在左子树和右子树中寻找 LCA,最终在最左侧或最右侧找到的节点即为 LCA。
以下是一个简单的 C++ 函数实现:
```cpp
class TreeNode {
public:
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode* findLCA(TreeNode* root, TreeNode* nodeA, TreeNode* nodeB) {
if (!root || !nodeA || !nodeB || (root == nodeA && root == nodeB)) return root; // 当前节点为空或直接找到两个节点
if (root->val > nodeA->val && root->val > nodeB->val) { // A 在左边,B 可能在左或右
if (findLCA(root->left, nodeA, nodeB)) return root;
} else if (root->val < nodeA->val && root->val < nodeB->val) { // A 在右边,B 可能在左或右
if (findLCA(root->right, nodeA, nodeB)) return root;
} else { // 直接找到 LCA 或者无法继续搜索
return root;
}
}
```
阅读全文