基于公共祖先特点的递归做法
从根节点往下递归:
1. 若该节点是第一个值为o1或o2的节点,则该节点是最近公共祖先;
2. 否则,看左子树是否包含o1或o2:
2.1 若左子树包含o1或o2,则看右子树有没有:
a. 若右子树没有,则公共祖先在左子树
b. 若右子树有,则o1和o2肯定是左右子树一边一个,则公共祖先是根节点;
2.2 若左子树不包含o1和o2,则公共祖先在右子树或者该根子树不包含o1和o2。(两种情况都取决于右子树)
class Solution: def lowestCommonAncestor(self , root: TreeNode, o1: int, o2: int) -> int: # write code here return self.DFS(root, o1, o2).val # 该子树是否包含o1或o2 def DFS(self, root,o1, o2): if root is None: return None if root.val == o1&nbs***bsp;root.val == o2: return root left = self.DFS(root.left, o1, o2) if left == None: return self.DFS(root.right, o1, o2) # 左子树有,则看右子树有没有 # 若右子树没有,则右子树返回 None right = self.DFS(root.right, o1, o2) if right == None: return left # 左子树右子树都有,则最近的祖先节点是root return root