LeetCode Lowest Common Ancestor of a Binary Tree
发布日期:2025-04-05 01:08:33 浏览次数:10 分类:精选文章

本文共 1630 字,大约阅读时间需要 5 分钟。

寻找二叉树中两个节点的最低公共祖先(LCA)

在二叉树结构中,寻找两个给定节点的最低公共祖先(Lowest Common Ancestor,简称LCA)是一个常见的问题。LCA被定义为共有两个目标节点的最低层的公共祖先节点,包括这两个节点各自的路径。这意味着这个节点是两个目标节点上excluding彼此的共同祖先。

问题描述

给定如下二叉树结构:

3     /     \    5      1   / \   / \  6   2  0   8 /  \4    7

示例1:LCA(5, 1) 为节点3。此外,根据LCA的定义,一个节点可以是自己的祖先(此处的特殊情况,但实际应用中需明确节点是否为真实存在的条件)。

示例2:LCA(5,4) 为节点5,这是因为根据LCA的定义,节点可以是自己的子节点。


方法思路

要找出两个节点的最低公共祖先,我们可以采用以下方法:

  • 初始思考: 从根节点开始,分别记录两个目标节点(例如p和q)的路径。
  • 路径记录: 使用深度优先搜索(DFS)来收集p和q的路径信息,从而确定其在树中的位置。
  • 路径比较: 比较两个路径中的公共前子路径,最长的共同子路径即为它们的LCA。
  • 具体实现

    我们采用类似递归的方式来实现这个过程:

  • DFS遍历:定义一个递归函数dfs,用于记录路径信息。当到达目标节点时返回true,否则继续遍历左右子树。
  • 路径存储:通过一个列表记录每个节点的访问顺序。每当进入一个节点时,将其记录下来,离开节点时则移出。
  • 路径比较:从两路径的最短长度开始,从前往后比对,找到最大的共同子路径。

  • 代码解析

    class Solution {    vector
    path1; vector
    path2; bool dfs(TreeNode* root, TreeNode* target, vector
    & path) { path.push_back(root); if (root == target) return true; if (dfs(root->left, target, path)) return true; if (dfs(root->right, target, path)) return true; path.pop_back(); return false; } TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { path1.clear(); path2.clear(); if (!dfs(root, p, path1) || !dfs(root, q, path2)) return NULL; int pos = 0; int len = min(path1.size(), path2.size()); TreeNode* common = NULL; while (pos < len && path1[pos] == path2[pos]) { common = path1[pos++]; } return common; }};

    思路总结

  • 初始化路径:分别从根节点开始遍历目标节点p和q的路径。
  • 生成路径:收集每个节点的路径信息,记录访问顺序。
  • 路径比较:从两端的共同路径长度开始比对,遇到不一致的节点时停止,返回最后的公共节点作为LCA。
  • 这种方法确保我们能在有限时间内找到两个节点的最低公共祖先,适用于所有二叉树结构。

    上一篇:LeetCode Most Common Word 最常见的词
    下一篇:LeetCode Largest Divisible Subset

    发表评论

    最新留言

    初次前来,多多关照!
    [***.217.46.12]2025年05月01日 18时16分42秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章

    elTable火狐浏览器换行 2023-01-24
    15个Python数据处理技巧(非常详细)零基础入门到精通,收藏这一篇就够了 2023-01-24
    2023年深信服、奇安信、360等大厂网络安全校招面试真题合集(附答案),让你面试轻松无压力! 2023-01-24
    2024年全国程序员平均薪资排名:同样是程序员,为什么差这么多?零基础到精通,收藏这篇就够了 2023-01-24
    0基础成功转行网络安全工程师,年薪30W+,经验总结都在这(建议收藏) 2023-01-24
    100个电脑常用组合键大全(非常详细)零基础入门到精通,收藏这篇就够了 2023-01-24
    10个程序员可以接私活的平台 2023-01-24
    10个运维拿来就用的 Shell 脚本,用了才知道有多爽,零基础入门到精通,收藏这一篇就够了 2023-01-24
    10条sql语句优化的建议 2023-01-24
    10款最佳免费WiFi黑客工具(附传送门)零基础入门到精通,收藏这一篇就够了 2023-01-24
    15个备受欢迎的嵌入式GUI库,从零基础到精通,收藏这篇就够了! 2023-01-24
    15个程序员常逛的宝藏网站!!从零基础到精通,收藏这篇就够了! 2023-01-24
    2023应届毕业生找不到工作很焦虑怎么办? 2023-01-24
    2023最新版Node.js下载安装及环境配置教程(非常详细)从零基础入门到精通,看完这一篇就够了 2023-01-24
    2024 年需要了解的顶级大数据工具(非常详细)零基础入门到精通,收藏这一篇就够了 2023-01-24
    2024 最新 Kali Linux 定制化魔改,完整版,添加常见60渗透工具,零基础入门到精通,收藏这篇就够了 2023-01-24
    2024大模型行业应用十大典范案例集(非常详细)零基础入门到精通,收藏这一篇就够了 2023-01-24
    2024年全球顶尖杀毒软件,从零基础到精通,收藏这篇就够了! 2023-01-24
    2024年度“金智奖”揭晓:绿盟科技获双项大奖,创新驱动网络安全新高度。从零基础到精通,收藏这篇就够了! 2023-01-24
    2024年最流行的十大开源渗透测试工具 2023-01-24