我们从root开始判断,只有两种情况可以得到结果:

  • 当前节点的值等于p或q其中一个
  • 当前节点的值在p和q之间

如果以上都不满足,说明两个节点都在root的一边,我们判断一下root值和p值(或q值)的大小:

  • 如果都比root大,root往右边走一格
  • 如果都比root小,root往左边走一格

c++实现

class Solution {
public:
    int lowestCommonAncestor(TreeNode* root, int p, int q) {
        // write code here
        if(p == root->val || q == root->val) return root->val;  //有root直接返回
        if(p > root->val && q < root->val) return root->val;  //root两边各一个的也直接返回
        if(q > root->val && p < root->val) return root->val;
        
        if(q > root->val){
            return lowestCommonAncestor(root->right, p, q);
        }else{
            return lowestCommonAncestor(root->left, p, q);
        }
    }
};

python实现

# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def lowestCommonAncestor(self , root: TreeNode, p: int, q: int) -> int:
        # write code here
        if q == root.val or p == root.val:
            return root.val
        elif p < root.val < q:
            return root.val
        elif q < root.val < p:
            return root.val
        else:
            if q > root.val:
                return self.lowestCommonAncestor(root.right, p, q)
            else:
                return self.lowestCommonAncestor(root.left, p, q)