题目来源
题目描述
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
}
};
题目解析
递归
- 如果p,q都小于当前节点,那么最小公共祖先一定是在当前节点的左子树
- 如果p,q都大于当前节点,那么最小公共祖先一定是在当前节点的右子树
- 如果p,q的值刚好在当前节点的中间(值不等于当前节点),也就是说q,p一定是当前节点的左右两边,那么当前节点一定是最小公共祖先
class Solution {
public:
// p、q 为不同节点且均存在于给定的二叉搜索树中。一定不为空
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == nullptr || p == root || q == root){
return root;
}
if (p->val < root->val && q->val < root->val){
return lowestCommonAncestor(root->left, p, q);
}else if(p->val > root->val && q->val > root->val){
return lowestCommonAncestor(root->right, p, q);
}else{
return root;
}
}
};
非递归写法
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
while (true) {
if (root->val > max(p->val, q->val)) root = root->left;
else if (root->val < min(p->val, q->val)) root = root->right;
else break;
}
return root;
}
};
类似题目
题目 | 思路 |
---|---|
235. 二叉搜索树的最近公共祖先 | |
236. 二叉树的最近公共祖先 |