一、算法思路:
本节主要为最近公共祖先,算法利用的为递归的方式,总体思路就是先从根节点出发,然后判断根节点的子节点是否包含需要寻找最近公共祖先的左右节点,如果包含的话则往下一层继续寻找,具体的思路可以分成如下几步:
-
- 先判断根节点是否为空,如果为空的话即返回空
-
- 在判断根结点是否为左右节点的其中一个,如果是,那么这个根节点就必为最近公共祖先
-
- 如果不满足1,2说明最近公共祖先在根节点的左右子树中,因此分别递归遍历根节点的左右子树
Treenode left=lowestCommonAncestor(root.left,p,q);
Treenode right=lowestCommonAncestor(root.right,p,q);
- 如果不满足1,2说明最近公共祖先在根节点的左右子树中,因此分别递归遍历根节点的左右子树
-
- 如果左右子树都不为空,说明待求的左右节点分别分布在左右子树中,因此这个节点就是最近的公共祖先
如果左右子树都为空,说明不存在最近公共祖先,所以要返回空
如果左子树或右子树为空,那么说明待求的左右节点包含在左子树或者右子树中,因此往左/右子树搜索即可
- 如果左右子树都不为空,说明待求的左右节点分别分布在左右子树中,因此这个节点就是最近的公共祖先
*参考链接:https://www.cnblogs.com/diShuiZhiYi/p/14465770.html
二、代码
/*
* 本节主要为最近公共祖先,算法利用的为递归的方式,总体思路就是先从根节点出发,然后
* 判断根节点的子节点是否包含需要寻找最近公共祖先的左右节点,如果包含的话则往下一层继续寻找
* 具体的思路可以分成如下几步:
* 1) 先判断根节点是否为空,如果为空的话即返回空
* 2) 在判断根结点是否为左右节点的其中一个,如果是,那么这个根节点就必为最近公共祖先
* 3) 如果不满足1,2说明最近公共祖先在根节点的左右子树中,因此分别递归遍历根节点的左右子树
* Treenode left=lowestCommonAncestor(root.left,p,q);
* Treenode right=lowestCommonAncestor(root.right,p,q);
* 4) 如果左右子树都不为空,说明待求的左右节点分别分布在左右子树中,因此这个节点就是最近的公共祖先
* 如果左右子树都为空,说明不存在最近公共祖先,所以要返回空
* 如果左子树或右子树为空,那么说明待求的左右节点包含在左子树或者右子树中,因此往左/右子树搜索即可
*
*参考链接:https://www.cnblogs.com/diShuiZhiYi/p/14465770.html
*
*/
public class _最近公共祖先 {
static class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {val=x;}
};
static TreeNode lowestCommonAncestor(TreeNode root,TreeNode left,TreeNode right) {
if(root==null) return null;
if(root==left||root==right) return root;
TreeNode left1=lowestCommonAncestor(root.left,left,right);
TreeNode right1=lowestCommonAncestor(root.right,left,right);
if(left1!=null&&right1!=null) {
return root;
}
if(left1==null&&right1==null) {
return null;
}
return left1==null?right1:left1;
};
public static void main(String []args) {
TreeNode head=new TreeNode(1);
TreeNode left=new TreeNode(2);
TreeNode right=new TreeNode(3);
TreeNode left1=new TreeNode(4);
TreeNode right1=new TreeNode(5);
head.left=left;
head.right=right;
left.left=left1;
left.right=right1;
TreeNode lowestcommonancestor=lowestCommonAncestor(head,left1,right1);
System.out.print(lowestcommonancestor.val);
}
}