面试题68:二叉搜索树的最近公共祖先
(1)给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
// 二叉搜索树!
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(p->val > q->val) // 保证p<val < q->val
{
TreeNode* tmp = p;
p = q;
q = tmp;
}
while(root!=nullptr)
{
if(root->val < p->val) // 如果root->val < p->val,说明两节点在root的右边
{
root = root->right;
}
else if(root->val > q->val) // 如果root->val > q->val,说明两节点在root的左边
root = root->left;
else // 此时root就是最近公共祖先节点
break;
}
return root;
}
};
(2)给定一个搜索树, 找到该树中两个指定节点的最近公共祖先。
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
//终止条件:如果递归到叶节点返回nullptr,如果递归到的节点的值=p||q,则返回节点;
if(root == nullptr || root == p || root == q) return root;
TreeNode *left = lowestCommonAncestor(root->left, p, q); // 进行递归:递归左子树;
TreeNode *right = lowestCommonAncestor(root->right, p, q); // 进行递归:递归右子树;
if(left == nullptr) return right; // 处理返回值:如果左子树为空,则公共祖先在右子树;
if(right == nullptr) return left; // 处理返回值:如果右子树为空,则公共祖先在左子树;
return root; // 处理返回值:如果左子树和右子树都 非空,则公共祖先就是此root节点;
}
};