songyy5517 / DataStructures-Algorithms

0 stars 0 forks source link

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

Open songyy5517 opened 1 year ago

songyy5517 commented 1 year ago

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5] 0.0

示例 1:

输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
输出: 6 
解释: 节点 2 和节点 8 的最近公共祖先是 6。

示例 2:

输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
输出: 2
解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。

分析 这道题的主要考察的是二叉搜索数,最近祖先的性质。从根节点开始,若当前节点都大于p和q,则说明p,q都位于当前节点的左子树;若当前节点都小于p和q,则说明p,q都位于当前节点的右子树。子树中一定存在节点将p,q分开,这个节点就是它们的最近公共祖先。因此,我们只需要从根节点开始,自上而下搜索第一个位于区间[p,q]内的节点即可。

songyy5517 commented 1 year ago

思路:自上而下搜索第一个两节点区间内的节点

  1. 异常处理;
  2. 从根节点出发,自上而下搜索第一个两节点区间内的节点; (1)若两节点都大于当前节点,则去往当前节点的右子节点; (2)若两节点都小于当前节点,则去往当前节点的左子节点; (2)否则,说明当前节点位于区间内,返回当前节点;
  3. 返回节点;

复杂度分析

songyy5517 commented 1 year ago
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) {
        // write code here
        // 思路:第一个分开两个节点的节点。
        // 1. 异常处理
        if (root == null)
            return -1;

        // 2. 自上而下进行搜索
        while ((root.val - p) * (root.val - q) > 0){
            if (root.val > p)
                root = root.left;
            else
                root = root.right;
        }

        return root.val;
    }
}
songyy5517 commented 10 months ago

2024/2/1 2024/3/4