# Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None
classSolution: deflowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': # 1. 递归终止:找到目标节点或触及叶子节点 ifnot root or root is p or root is q: return root # 2. 向左右子树深挖 left = self.lowestCommonAncestor(root.left, p, q) right = self.lowestCommonAncestor(root.right, p, q) # 3. 后序逻辑判断 # 如果左右都有返回,说明 p, q 分居两侧,当前 root 即为 LCA if left and right: return root # 否则,返回非空的那个(代表在单侧找到了目标或找到了 LCA) return left or right
classTreeNode: def__init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right
defbuild_tree(arr): ifnot arr or arr[0] isNone: returnNone root = TreeNode(arr[0]) queue = [root] i = 1 while queue and i < len(arr): node = queue.pop(0) if arr[i] isnotNone: node.left = TreeNode(arr[i]) queue.append(node.left) i += 1 if i < len(arr) and arr[i] isnotNone: node.right = TreeNode(arr[i]) queue.append(node.right) i += 1 return root
deftree_to_list(root): ifnot root: return [] result = [] queue = [root] while queue: node = queue.pop(0) if node: result.append(node.val) queue.append(node.left) queue.append(node.right) else: result.append(None) while result and result[-1] isNone: result.pop() return result
classSolution: deflowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': # 1. 递归终止:找到目标节点或触及叶子节点 ifnot root or root is p or root is q: return root
# 2. 向左右子树深挖 left = self.lowestCommonAncestor(root.left, p, q) right = self.lowestCommonAncestor(root.right, p, q)
# 3. 后序逻辑判断 # 如果左右都有返回,说明 p, q 分居两侧,当前 root 即为 LCA if left and right: return root
# 否则,返回非空的那个(代表在单侧找到了目标或找到了 LCA) return left or right
defmain(): arr = sys.stdin.read().strip().split() tree_arr = [Noneif v == 'None'elseint(v) for v in arr] root = build_tree(tree_arr)
sol = Solution() result = sol.lowestCommonAncestor(root) print(result)