题解 | #二叉搜索树的最近公共祖先#

二叉搜索树的最近公共祖先

https://www.nowcoder.com/practice/d9820119321945f588ed6a26f0a6991f

思路

对于二叉树搜索树来说,由于左子树全部值小于根节点值小于右子树全部值,所以我们定位元素的位置其实也简单。

对于两个元素位置一般就两种情况:

  1. 两个节点一个为父节点一个为子节点,那么这个父节点便是两个节点的祖先节点
  2. 两个节点位置相对一个在左一个在右,那么两个节点的祖先节点便是查找分叉时的根节点

代码

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * @param root TreeNode类
     * @param p    int整型
     * @param q    int整型
     * @return int整型
     */
    public int lowestCommonAncestor(TreeNode root, int p, int q) {
        // 判断目标值大小
        if (p > q) {
            return findTheAncestorNode(root, p, q);
        } else {
            return findTheAncestorNode(root, q, p);
        }
        // 二叉搜索树的最近公共节点
    }

    /**
     * 传入根节点与两个目标值,返回祖先节点值
     *
     * @param root 根节点
     * @param p    目标1 默认更大
     * @param q    目标2 默认更小
     * @return int 祖先节点值
     * @apiNote
     * @since 2023/1/4 20:11
     */
    public int findTheAncestorNode(TreeNode root, int p, int q) {
        // 目标值同时在左边
        if (root.val > p && root.val > q) {
            // 递归的调用方法向左继续查找
            return findTheAncestorNode(root.left, p, q);
        }
        // 目标值同时在右边
        else if (root.val < p && root.val < q) {
            // 递归的调用方法向右继续查找
            return findTheAncestorNode(root.right, p, q);
        }
        // 如果目标值小的在左,大的在右,说明,当前节点即是祖先节点(查找分叉点)
        else if (root.val < p && root.val > q) {
            return root.val;
        }
        // 如果目标值大的等于节点值,返回该目标值,如果目标值小的等于节点值,也返回该节点目标值
        else {
            // 如果目标值大的等于节点值,返回该目标值
            if (root.val == p) {
                return p;
            }
            // 如果目标值小的等于节点值,也返回该节点目标值(当然两个目标值相等的情况不可能发生)
            return q;
        }
    }
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务