二叉搜索树的最近公共祖先和二叉树的最近公共祖先

1.二叉搜索树的最近公共祖先--给定一个二叉搜索树, 找到该树中两个指定节点(p&q)的最近公共祖先(root)。
首先,我们可以分为三种情况:
    1.指定节点分布在最近公共节点的两侧
    2.p==root&&q在root的左右子树中
    3.q==root&&p在root的左右子树中

方法一:迭代

1.循环搜索 终止条件--root为空
    1.p,q都在root的右子树中,则遍历root.right;
    2.p,q都在root的左子树中,则遍历root.left;
    3.否则找到,跳出

代码

public TreeNode lowestCommonAncestor(TreeNode root,TreeNode p,TreeNode q){
    while(root!=null){
        if(root.valp.val && root.val>q.val){
                root=root.left;
        }else{
                return root;
        }
    }
    return root;
}

方法二:递归(个人觉得更好理解)
1.递推

   当p,q在同一侧开启递归

2.返回值--最近公共祖先root;
代码

public TreeNode lowestAncestor(TreeNode root,TreeNode p,TreeNode q){
    if(root.valpa.val && root.val>q.val){
        return 
        lowestCommonAncestor(root.left,p,q);
    }
    return root;
}
2.二叉的最近公共祖先--给定一个二叉树(注意和上面不一样,第一题是二叉搜索树), 找到该树中两个指定节点(p&q)的最近公共祖先(root)。

和第一题一样三种情况
递归
1.终止条件:

1.当越过叶子节点,则直接返回null;
2.当root==p|| root==q ,返回root;

2.递推

1.开启左递归,记为left
2.开启右递归,记为right

3.返回值

    1.当left and right同时为空:不包含p和q,返回null;
    2.当left and right同时不为空:说明分布在异侧,返回root;
    3.left为空,right不为空
            1.p,q其中一个在root的右子树中,此时right指向p;
            2.p,q都在root的右子树中,此时指向最近公共节点 

4.当left不为空

public TreeNode lowestCommonAncestor(TreeNode root,TreeNode p,TreeNode q){
if(root==null || root==p || root==q){
return root;
}
TreeNode left=lowestCommonAncestor( root.left,p,q);
TreeNode right=lowestCommonAncestor( root.right,p,q);
}
if(left==null && right==null){
return null;}
if(left==null){
return right;}
if(right==null){
return left;}
return root;
}

你可能感兴趣的:(java,算法)