跳转至

235.二叉搜索树的最近公共祖先 (Easy)*

题目描述*

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

示例*

输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8

输出: 6

输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4

输出: 2

代码*

是二叉搜索树,所以只要比较大小关系就行。一共也就几种情况,结点都小于根结点,则在左子树,大于在右子树,一个大一个小就是当前根结点。

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(p->val > q->val) {
            return lowestCommonAncestor(root, q, p);
        }
        if(p->val == root->val || q->val == root->val) {
            return root;
        }
        if(q->val < root->val) {
            return lowestCommonAncestor(root->left, p, q);
        }else if(p->val > root->val) {
            return lowestCommonAncestor(root->right, p, q);
        }else {
            return root;
        }
    }
};
class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root == nullptr || p == nullptr || q == nullptr) {
            return nullptr;
        }
        int qv = q->val, pv = p->val;
        if(pv == root->val && qv == root->val) {
            return root;
        }
        if(pv > qv) {
            int tmp = pv;
            pv = qv;
            qv = tmp;
        }
        while(root != nullptr) {
            if(qv < root->val) {
                root = root->left;
            }else if(pv > root->val) {
                root = root->right;
            } else {
                return root;
            }
        }
        return nullptr;
    }
};

最后更新: July 23, 2022