方法一:搜索路径比较
得到两个目标值在二叉搜索数的路径,对两个路径进行比较,最后一个相同的结点就是最近的公共祖先
时间复杂度: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); } };