力扣:二叉搜索树的最近公共节点java
与二叉树最近公共祖先的区别:利用搜索二叉树的特性快速判断,最近公共节点在左子树还是右子树,并通过判断当前节点在目标节点范围中,就返回当前节点(此时该节点就是最近公共祖先)(那该节点会不会是最近公共节点?不会。因为如果在向左或向右,就会丢失其中一个目标节点)
流程:
递归三部曲:
参数和返回值:返回值为节点,参数为根节点和两个目标节点
结束条件:节点为空格就返回null
单层递归逻辑
判断节点如果小于两个目标节点,就返回 递归该节点的右子树
判断节点如果大于两个目标节点,就返回 递归该节点的左子树
最后返回该节点(此时节点一定在两个目标值之间)
代码
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null) return null;//结束条件,节点为空就返回null
if(root.val>p.val&&root.val>q.val) //该节点大于两个目标节点,返回递归右孩子的公共节点
return lowestCommonAncestor(root.left,p,q);
if(root.val<p.val&&root.val<q.val)//该节点小于两个目标节点,返回递归左孩子的公共节点
return lowestCommonAncestor(root.right,p,q);
return root;//该节点在两个目标节点之间,返回递归公共节点,该节点就是最近公共祖先
}
}