如果给定root是null,即空树,则返回的公共节点自然就是null;
如果给定root与两个节点中任何一个相同,说明,root在就是所要找的两个节点之一,则直接返回root,表明在当前链路中找到至少一个节点;
如果给定root不是两个节点中任何一个,则说明,需要在root的左右子树中重新查找。
此时有三种情况:
两个节点都在左子树上;个节点都在右子树上;一个在左子树,一个在右子树上。
具体来说,就是:
情况一:如果左子树查找出的公共节点是null,则表明从左子树根节点开始到左子树的所有叶子节点等所有节点中,没有找到两个节点中的任何一个,这就说明,这两个节点不在左子树上,不在左子树,则必定在右子树上;
情况二:如果右子树查找的公共节点是null,说明在右子树中无法找到任何一个节点,则两个节点必定在左子树上;
情况三: 如果左右子树查找的公共节点都不是null,说明左右子树中各包含一个节点,则当前节点root就是最低公共节点,返回就可以了。
class TreeNode{
int val;
TreeNode left;
TreeNode right;
}
TreeNode lastCommonParent(TreeNode root, TreeNode node1, TreeNode node2){
if(root == null)
return null;
if(root == node1 || root == node2)
return root;
TreeNode left = lastCommonParent(root.left, node1, node2);
TreeNode right = lastCommonParent(root.right, node1, node2);
if(left == null)
return right;
else if(right == null)
return left;
else
return root;
}