心路历程:
这道题其实不是很好想,本质在考察二叉树的后序搜索过程,也相当于自底向上的搜索过程。二叉树的后序搜索其实就是一种针对结点的回溯算法(一般的回溯为针对路径)。
这道题结点有四种可能情况:p,q,空,不为p或q。当结点为前三种情况时直接返回结点即可。对于第四种结点情况需要分情况讨论,如下图所示:
解法:二叉树的后序遍历:
# 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':
def dfs(node): # 递归函数返回值定义为p和q的公共祖先;后序遍历就是天然的回溯算法
if not node or node == p or node == q: return node
lv = dfs(node.left)
rv = dfs(node.right)
if lv and rv: return node
elif lv and not rv: return lv
elif not lv and rv: return rv
else: return None
return dfs(root)