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.val<p.val && root.val<p.val){                root=root.right;        }else if(root.val>p.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.val<p.val && root.val<q.val){        return lowestCommonAncestor(root.right,p,q);    }    if(root.val>pa.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.开启左递归,记为left2.开启右递归,记为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;}