题目描述:
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
示例:
分析
利用二叉搜索树的性质:左 < 根 < 右
- 当root的值大于p和q的值,那么祖先就在root的左子树
- 当root的值小于p和q的值,那么祖先就在root的右子树
- 当root的值在区间[p,q]或者[q,p]之间(区间是闭区间哦),那么祖先就是root本人了
代码如下:
/**
* 递归
* @param root
* @param p
* @param q
* @return
*/
public TreeNode lowestCommonAncestor1(TreeNode root, TreeNode p, TreeNode q) {
if(root.val < p.val && root.val < q.val){
return lowestCommonAncestor1(root.right, p, q);
}else if(root.val > p.val && root.val > q.val){
return lowestCommonAncestor1(root.left, p, q);
}else{
return root;
}
}
/**
* 迭代
* 只不过把递归用迭代写出来了
* @param root
* @param p
* @param q
* @return
*/
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
while(root != null){
if(root.val < p.val && root.val < q.val) root = root.right;
else if(root.val > p.val && root.val > q.val) root = root.left;
else return root;
}
return null;
}