题目:
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
235. 二叉搜索树的最近公共祖先
题解:
1. 题解一:迭代法
2. 题解二:递归法(优选)
代码:
1. 代码一:迭代法
public class 面试题68_1 {
// 方法1:迭代
public static TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
while(root != null) // 当节点 root 为空时跳出
{
if(root.val < p.val && root.val < q.val) // p,q 都在 root 的右子树中
{
root = root.right; // 遍历至右子节点
}
else if(root.val > p.val && root.val > q.val) // p,q 都在 root 的左子树中
{
root = root.left; // 遍历至左子节点
}
else
{
break; // 否则,说明找到了 最近公共祖先 ,跳出。
}
}
return root; // 返回最近公共祖先 root
}
public static void main(String[] args) {
Integer nums[] = { 6, 2, 8, 0, 4, 7, 9, null, null, 3, 5 };
TreeNode root = ConstructTree.constructTree(nums);
TreeOperation.show(root);
System.out.println("***************************************");
TreeNode p1 = new TreeNode(2);
TreeNode q1 = new TreeNode(8);
TreeNode res1 = lowestCommonAncestor(root, p1, q1);
System.out.println(res1.val);
System.out.println("***************************************");
TreeNode p2 = new TreeNode(2);
TreeNode q2 = new TreeNode(4);
TreeNode res2 = lowestCommonAncestor(root, p2, q2);
System.out.println(res2.val);
}
}
2. 代码二:递归法(优选)
public class 面试题68_1 {
// 方法2:递归
public static TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root.val < p.val && root.val < q.val)
{
return lowestCommonAncestor(root.right, p, q); // 当p,q都比root大时,根据二叉搜索树的性质,则p和q的公共祖先一定在root的右子树上
}
if(root.val > p.val && root.val > q.val)
{
return lowestCommonAncestor(root.left, p, q); //同理,当p,q都比root小时,则去root的左子树上找。
}
// 如果p或q等于root了,则说明这个等于的节点就是公共祖先
//否则则p和q是在root的两边,则root是公共祖先
return root;
// 下面几句可以合并成 return root;
// if(p.val == root.val)
// {
// return p;
// }
// else if(q.val == root.val)
// {
// return q;
// }
// else
// {
// return root;
// }
}
public static void main(String[] args) {
Integer nums[] = { 6, 2, 8, 0, 4, 7, 9, null, null, 3, 5 };
TreeNode root = ConstructTree.constructTree(nums);
TreeOperation.show(root);
System.out.println("***************************************");
TreeNode p1 = new TreeNode(2);
TreeNode q1 = new TreeNode(8);
TreeNode res1 = lowestCommonAncestor(root, p1, q1);
System.out.println(res1.val);
System.out.println("***************************************");
TreeNode p2 = new TreeNode(2);
TreeNode q2 = new TreeNode(4);
TreeNode res2 = lowestCommonAncestor(root, p2, q2);
System.out.println(res2.val);
}
}