題目:
劍指 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);
}
}