# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        """
        main idea: since p,q not necessary exist in the tree, need to traverse all the nodes in the tree before check if current node is p or q
        tc O(N) sc O(N)
        """
        self.cnt = 0
        def dfs(node,p,q):
            if not node: 
                return node
            # NOTE this is to find p or q in sub tree not finding LCA 
            leftpq = dfs(node.left,p,q)
            rightpq = dfs(node.right,p,q)
            # note the position of q,p check has to be below recursion but above subtree check 
            if p == node or q == node:
                self.cnt += 1
                return node 
            if leftLCA and rightLCA:
                return node
            elif rightLCA:
                return rightLCA
            elif leftLCA:
                return leftLCA

        res = dfs(root,p,q)
        return None if self.cnt != 2 else res 

TODO : Eulerian Path refer