思路:同样可以采取二叉树最近公共祖先的算法

1、深度优先遍历dfs,判断当前节点是否为o1、o2,先找到的必为祖先

2、递归左右子树

  • 左右子树中均分布o1、o2,则公共祖先为当前节点

  • 均在左,则返回左,均在右,则返回右

注意:

此题有一个小坑,由于存在值为0的val,所以不能用not root判断无结果返回

class Solution:
    def lowestCommonAncestor(self , root: TreeNode, p: int, q: int) -> int:
        if not root:
            return
        
        if root.val == p or root.val == q:
            return root.val
        
        left = self.lowestCommonAncestor(root.left, p, q)
        right = self.lowestCommonAncestor(root.right, p, q)
        print(root.val, left, right)
        
        if left != None and right != None: # 小坑! 不能用not left and not right
            return root.val
        if not right:
            return left
        if not left:
            return right