问题:
给定一棵二叉树的头节点head,以及这棵树中的两个节点o1和o2,请返回o1和o2的最近公共祖先节点
基本思路:
后序遍历二叉树,假设遍历到的当前节点为cur,首先依次遍历它的左孩子和右孩子,此时可能发生以下的四种情景:
- 如果发现cur等于None,或者等于o1或者等于o2,返回cur
- 如果左孩子和右孩子都为空,说明cur整棵子树上没有出现过o1和o2,返回None
- 如果左孩子和右孩子都不为空,说明左子树中发现过o1或者o2,右子树中发现过o2或者o1,此时cur就是这两个节点的最近公共节点,返回cur
- 如果左孩子和右孩子一个为空一个不为空,此时不为空的节点要么是o1或o2中的一个,要么已经是o1和o2的公共节点,返回此节点即可
#python3.5
#在二叉树中找到两个节点的最近公共节点
def lowestAncestor(head, o1, o2):
if head == None or head == o1 or head == o2:
return head
left = lowestAncestor(head.left, o1, o2)
right = lowsetAncestor(head.right, o1, o2)
if left and right:
return head
return left if left else right