解决问题的方法:后序遍历二叉树,假设遍历到的当前节点为curr。因为后续遍历的原因,先处理curr的两颗子树。假设左子树返回的节点为left,右子树返回的节点为right。
1 如果发现curr为null,或者curr为o1或者o2,则返回。
2 如果left和right都为空,说明整棵树上没有发现过o1或o2,返回null。
3 如果left 和right都不为空,说明左子树上发现过o1或者o2,右子树中法现过o1或者o2,两个子树在向上走 的过程中 ,首次在curr相遇,返回curr。
4 如果有一个为空,,另一个不为空,则直接返回不为空的哪一个。
代码:
public Node lowestAncestor (Node head ,Node o1,Node o2)
{
if(head == null || head ==o1 || head == o2 )
{
return head;}
Node left = lowestAncetor(head.left,o1,o2);
Node right = lowestAncetor(head.right,o1,o2);
if(left && right)
return head;
return left != null?left:right;
}