方法一:搜索路径比较
得到两个目标值在二叉搜索数的路径,对两个路径进行比较,最后一个相同的结点就是最近的公共祖先
时间复杂度:o(n)
空间复杂度:o(n)。需要辅助队列存储路径
class Solution {
public:
//获取从根节点到目标值的路径
queue<TreeNode*> getPath(TreeNode* root, int target) {
queue<TreeNode*> res;
while (root->val != target) {
res.push(root);
if (target > root->val)
root = root->right;
else
root = root->left;
}
res.push(root);
return res;
}
int lowestCommonAncestor(TreeNode* root, int p, int q) {
//得到两个目标值在二叉树的路径
queue<TreeNode*> q1 = getPath(root, p);
queue<TreeNode*> q2 = getPath(root, q);
TreeNode* pub;
//最后一个相等的结点就是最近的公共祖先
while (!q1.empty() && !q2.empty()) {
if (q1.front() == q2.front())
pub = q1.front();
q1.pop();
q2.pop();
}
return pub->val;
}
};
方法二:递归
时间复杂度:o(n)
空间复杂度:o(n)
class Solution {
public:
int lowestCommonAncestor(TreeNode* root, int p, int q) {
//如果当前结点与目前值相同,则当前就是最近的公共祖先
if (root->val == p || root->val == q)
return root->val;
//如果遍历到当前结点,两个目标值需要分别走向左右子树,则当前就是最近的公共祖先
if ((root->val > p && root->val < q) ||
(root->val < p && root->val > q))
return root->val;
//继续向下遍历寻找最近的公共祖先
else if (root->val > p && root->val > q)
return lowestCommonAncestor(root->left, p, q);
else
return lowestCommonAncestor(root->right, p, q);
}
};

京公网安备 11010502036488号