大厂面试真题详解:最近公共祖先 II

简介: 大厂面试真题详解:最近公共祖先 II

给一棵二叉树和二叉树中的两个节点,找到这两个节点的最近公共祖先LCA。
两个节点的最近公共祖先,是指两个节点的所有父亲节点中(包括这两个节点),离这两个节点最近的公共的节点。
每个节点除了左右儿子指针以外,还包含一个父亲指针parent,指向自己的父亲。

在线评测地址:领扣题库官网

样例 1:
输入:{4,3,7,#,#,5,6},3,5
输出:4
解释:
     4
     / \
    3   7
       / \
      5   6
LCA(3, 5) = 4
样例 2:
输入:{4,3,7,#,#,5,6},5,6
输出:7
解释:
      4
     / \
    3   7
       / \
      5   6
LCA(5, 6) = 7

解题思路

  • 这道题与88. 最近公共祖先相似,不同的是该题的节点有父指针,所以我们应该充分利用这个信息。我们可以用hashset来解这道题。
    算法流程
  • 建立集合parentSet,用于存储A的祖先节点。
  • 首先,从A向上遍历到root,将路径中的节点都存储到parentSet中。
  • 然后,从B向上遍历,判断经过的每个节点是否同时也在parentSet中,第一个出现在parentSet中的点即为A和B的最近公共祖先。

复杂度分析

  • 时间复杂度:O(k),k为树的高度。最差情况下,A是叶节点,从A遍历到root需要O(k)的时间。平均情况下时间复杂度也为O(k)。
  • 空间复杂度:O(k),k为树的高度。最差情况下,A是叶节点,集合中需要存储从A到root的所有节点。平均情况下空间复杂度也为O(k)。
public class Solution {
    /*
     * @param root: The root of the tree
     * @param A: node in the tree
     * @param B: node in the tree
     * @return: The lowest common ancestor of A and B
     */
    public ParentTreeNode lowestCommonAncestorII(ParentTreeNode root,
                                                 ParentTreeNode A,
                                                 ParentTreeNode B) {
        Set parentSet = new HashSet<>();
        // 把A的祖先节点都加入到哈希表中
        ParentTreeNode curr = A;
        while (curr != null) {
            parentSet.add(curr);
            curr = curr.parent;
        }
        // 遍历B的祖先节点,第一个在哈希表中出现的即为答案
        curr = B;
        while (curr != null) {
            if (parentSet.contains(curr)) {
                return curr;
            }
            curr = curr.parent;
        }
        return null;
    }
}

更多题解参考:九章官网solution

相关文章
|
Serverless C语言 索引
华为面试C语言真题(二)
华为面试C语言真题( 二)
305 1
华为面试C语言真题(二)
|
安全 测试技术 Python
软件测试面试题及答案,这个题库有3千多道最新面试真题可以刷
相信对于很多软件测试新手来说,技术项目的面试是十分让人头疼的,生怕没回答得好,就会跟这个offer失之交臂
205 0
二叉树的最近公共祖先(中等难度)(面试常考)!!
二叉树的最近公共祖先(中等难度)(面试常考)!!
83 0
二叉树的最近公共祖先(中等难度)(面试常考)!!
|
设计模式 缓存 算法
腾讯Java高级岗180道面试真题,面试大厂拿45Koffer没问题!
一、数据结构与算法基础 · 说一下几种常见的排序算法和分别的复杂度。 · 用Java写一个冒泡排序算法 · 描述一下链式存储结构。 · 如何遍历一棵二叉树? · 倒排一个LinkedList。 · 用Java写一个递归遍历目录下面的所有文件
|
消息中间件 NoSQL 网络协议
字节跳动三面Java经历,砍下年薪50W的Offer,面试真题整理分享
应广大读者要求,今天开更一些大厂的面经和相关的面试干货,下面这份**最新字节跳动春招面经+笔记**带给大家。
153 0
字节跳动三面Java经历,砍下年薪50W的Offer,面试真题整理分享
|
NoSQL 算法 Dubbo
Java工程师丨面试真题(二)
Java工程师丨面试真题(二)
Java工程师丨面试真题(二)
Java工程师丨面试真题(一)
Java工程师丨面试真题(一)
|
存储 自然语言处理 前端开发
【牛客刷题】大厂真题 | 前端面试篇(一)
【牛客刷题】大厂真题 | 前端面试篇(一)
193 0
|
人工智能 Java 测试技术
【牛客刷题系列】Java工程师 | 百度面试真题(二)
【牛客刷题系列】Java工程师 | 百度面试真题(二)
123 0