二叉树中大多数是从父节点向子节点遍历,例如回溯算法。而这个解法的重点,在于掌握树结构中,从子节点向上遍历父节点的方法。因为子节点没有父节点的信息。所以要构造一个数据,使得子节点包含父节点信息。
所以此处采用了map数据结构,将子节点映射到父节点。
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':
root_map = {}
def dfs(node):
if node.left:
root_map[node.left] = node
dfs(node.left)
if node.right:
root_map[node.right] = node
dfs(node.right)
dfs(root)
p_parent = []
while p!=None:
p_parent.append(p)
p = root_map.get(p)
while q!=None:
if q in p_parent:
return q
q = root_map.get(q)
if __name__ == '__main__':
root = TreeNode(3)
node1 = TreeNode(5)
node2 = TreeNode(1)
node3 = TreeNode(6)
node4 = TreeNode(2)
node5 = TreeNode(0)
node6 = TreeNode(8)
node7 = TreeNode(7)
node8 = TreeNode(4)
root.left = node1
root.right = node2
node1.left = node3
node1.right = node4
node2.left = node5
node2.right = node6
node4.left = node7
node4.right = node8
res = Solution().lowestCommonAncestor(root,node1,node2)
print(res.val)
```