求二叉树节点的最近公共祖先
题目描述:给定两个节点p和q,求两个节点的最近公共祖先。
思路:
1.看p或者q是否为根节点,若有一个是;则最近的公共祖先是根节点。
2.分别在根节点的左子树和右子树中找p节点和q节点:
- 1)左右子树两边的都不为空,则说明p、q存在于根节点的左子树或者右子树;则最近公共祖先是根节点。
- 2)左不空,右空;则说明p、q存在于根节点的左子树中,则最近公共祖先是在左树中先找到的那个。
- 3)右不空,左空;说明p、q都在根节点的右子树,则最近公共祖先是右树中最先找到的那个。
代码实现:
public Node lowestCommonAncester(Node root,Node p,Node q){
if(root == null){
return null;
}
if(p == root || q == root){
return root;
}
Node leftNode = lowestCommonAncester(root.left,p,q);
Node rightNode = lowestCommonAncester(root.right,p,q);
if(leftNode != null && rightNode != null){
return root;
}
if(leftNode != null && rightNode == null){
return leftNode;
}
if(leftNode == null && rightNode != null){
return rightNode;
}
return null;
}