剑指 Offer 68 - I. 二叉搜索树的最近公共祖先

image.png

递归法

  1. public class Solution {
  2. /**
  3. * 因为是二叉搜索树,所以可以使用其特性快速找到结果
  4. * 如果两个节点都在 root 的左边,就往左走一步
  5. * 如果两个节点都在 root 的右边,就往右走一步
  6. * 如果两个节点分别在 root 左边和右边,直接返回 root
  7. */
  8. public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
  9. if (p.val < root.val && q.val < root.val) {
  10. return lowestCommonAncestor(root.left, p, q);
  11. } else if (p.val > root.val && q.val > root.val) {
  12. return lowestCommonAncestor(root.right, p, q);
  13. }
  14. return root;
  15. }
  16. }

迭代法

  1. public class Solution {
  2. /**
  3. * 因为是二叉搜索树,所以可以使用其特性快速找到结果
  4. * 如果两个节点都在 root 的左边,就往左走一步
  5. * 如果两个节点都在 root 的右边,就往右走一步
  6. * 如果两个节点分别在 root 左边和右边,直接返回 root
  7. */
  8. public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
  9. while(true) {
  10. if (p.val < root.val && q.val < root.val) {
  11. root = root.left;
  12. } else if (p.val > root.val && q.val > root.val) {
  13. root = root.right;
  14. } else {
  15. break;
  16. }
  17. }
  18. return root;
  19. }
  20. }