二叉搜索树的公共祖先

题目描述

力扣链接🔗

二叉搜索树的公共祖先 - 图1

代码思路

递归法

使用二叉搜索树的性质,最近祖先就是在p,q区间,根据搜索二叉树的二叉树进行递归,注意此时找的是根节点,递归到刚好在那个区间的时候返回,那么此时就是最近的公共祖先节点。注意只遍历一条边,要返回值。

  1. /**
  2. * 递归法
  3. *
  4. * @param root
  5. * @param p
  6. * @param q
  7. * @return
  8. */
  9. public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
  10. if (root == null) {
  11. return root;
  12. }
  13. if (root.val > p.val && root.val > q.val) { // 都大于搜索的值的话,向左边搜索,此时不知道p,q大小,需要都做判断
  14. TreeNode left = lowestCommonAncestor(root.left, p, q);
  15. if (left != null) { // 只遍历一条边,此时如果找到直接返回
  16. return left;
  17. }
  18. } else if (root.val < p.val && root.val < q.val) { // 都小于搜索的值的话,向右边搜索,此时不知道p,q大小,需要都做判断
  19. TreeNode right = lowestCommonAncestor(root.right, p, q);
  20. if (right != null) {
  21. return right;
  22. }
  23. }
  24. return root;
  25. }

迭代法

  1. /**
  2. * 迭代法
  3. *
  4. * @param root
  5. * @param p
  6. * @param q
  7. * @return
  8. */
  9. public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
  10. while (root != null) {
  11. if (root.val > p.val && root.val > q.val) {
  12. root = root.left;
  13. } else if (root.val < p.val && root.val < q.val) {
  14. root = root.right;
  15. }else {
  16. return root;
  17. }
  18. }
  19. return null;
  20. }